是一个与元素本身兼容的元素的结构
Is a struct of one element compatible with the element itself?
如果我有以下结构:
struct Foo { int a; };
下面的代码是否符合C++标准?我的意思是,它不能产生一个"未定义的行为"吗?
Foo foo;
int ifoo;
foo = *reinterpret_cast<Foo*>(&ifoo);
void bar(int value);
bar(*reinterpret_cast<int*>(&foo));
auto fptr = static_cast<void(*)(...)>(&bar);
fptr(foo);
N3290中的9.2/20表示
一个指向标准布局结构对象的指针,使用interpret_cast进行适当转换,指向其初始成员(或者,如果该成员是位字段,则指向其所在的单元),反之亦然。
你的Foo是一个标准布局类。
所以你的第二个演员阵容是正确的。
我看不出第一个是正确的(我使用的架构中,字符的对齐限制比只包含字符的结构弱,在这种架构中,这会有问题)。标准的保证是,如果您有一个指向int的指针,它真正指向结构的第一个元素,那么您可以将其重新解释为指向该结构的指针。
同样,如果第三个是repret_cast,我看不出会定义什么(我很确定一些ABI使用不同的约定来传递结构和基本类型,所以这是非常可疑的,我需要在标准中明确提及才能接受它),我也很确定没有什么允许函数指针之间使用static_cast。
只要只访问结构的第一个元素,它就被认为是安全的,因为在结构的第一成员之前没有填充。事实上,例如,在Objecive-C运行时中使用了这种技巧,其中通用指针类型定义为:
typedef struct objc_object {
Class isa;
} *id;
在运行时,真正的对象(仍然是裸露的结构指针)具有如下的内存布局:
struct {
Class isa;
int x; // random other data as instance variables
} *CustomObject;
并且运行时使用该方法访问实际对象的类。
Foo是一个简单的旧数据结构,这意味着它只包含您明确存储在其中的数据。因此,int和Foo的内存布局是相同的。
你可以毫无问题地从一个类型转换到另一个类型。使用这种东西是否明智是另一个问题。
PS:这种通常有效,但不一定是由于不同的对齐限制。请参阅A程序员的回答。
相关文章:
- 使用不带参数的函数访问结构元素
- 带结构的二维矢量:如何存储元素
- 访问类lintalizer列表中的结构元素
- 如何为 c++ 的不同变量类型的结构元素创建动态数组?
- 设计将引用元素移动到开头的数据结构.C++
- 结构元素名称要 cout?
- C++:添加新结构时,结构指针向量中的所有元素都会更新
- 从指向结构数组的指针中提取元素
- 继承层次结构并将元素添加到向量
- 在集合中查找使用结构C++的元素
- C++结构元素(成员变量)的数量
- 无法在 Mosquitto MQTT Broker 插件上访问结构体 mosquitto 的元素
- 在C++中更改结构内部元素的方法?
- 保持排序的数据结构,允许log N插入时间,并且可以返回我在log N中查找的元素的索引
- 如何为结构的数据元素赋值
- 如何使用矢量元素将项目添加到结构中?
- 获取结构 c++ 中元素的索引
- C++ STL 数据结构常时按索引推送/弹出/随机访问,并具有指向元素的可靠指针
- 指向结构的指针向量的元素具有相同的地址
- 为什么将函数的返回类型从结构节点*更改为void后,链表的元素没有显示create_ll和显示?