![]() |
1
61
C++标准
保证
一个C的内存布局
类或结构是pod,如果:
关于允许的“C++ + ISM”是非虚成员函数、静态成员和成员函数。 由于您的类既有构造函数又有析构函数,所以从形式上讲,它不属于pod类型,因此保证不成立。(尽管,正如其他人提到的,在实践中,只要没有虚拟函数,在您尝试的任何编译器上,这两个布局都可能是相同的)。 见第[26.7]节 C++ FAQ Lite 了解更多详细信息。 |
![]() |
2
10
行为不能保证,它依赖于编译器。 尽管如此,如果示例ou类不包含虚拟方法(并且不从基类继承),那么答案是“是的,在我的机器上”。 |
![]() |
3
7
在您描述的情况下,答案是“可能是”。但是,如果类具有任何虚拟函数(包括可以从基类继承的虚拟析构函数),或者使用多个继承,则类布局可能不同。 |
![]() |
4
3
添加其他人所说的内容(例如:特定于编译器,只要您没有虚拟函数,就可能工作): 我强烈建议使用静态断言(编译时检查),如果您这样做,sizeof(example_class)==sizeof(example_struct)。请参阅boost \u static \u assert,或等效的特定编译器或自定义构造。如果有人(或某些东西,如编译器的更改)修改类使匹配无效,那么这是一个很好的第一道防线。如果需要额外的检查,还可以运行时检查成员的偏移量是否相同,这(与静态大小断言一起)将确保正确性。 |
![]() |
5
1
在C++编译器的早期,编译器首先用类更改结构关键字,然后编译。很多相似之处。 差异来自类继承,特别是虚拟函数。如果类包含虚拟函数,那么它必须在其布局的开头有指向类型描述符的指针。另外,如果类B继承自类A,那么类A的布局首先出现,然后是类B自己的布局。 因此,关于将类实例强制转换为结构实例的问题的确切答案是:取决于类内容。对于具有方法(构造函数和非虚拟析构函数)的特定类,布局可能是相同的。如果析构函数声明为虚拟的,那么布局在结构和类之间肯定会有所不同。 这里有一篇文章表明,从C结构到C++类的步骤没有太大的必要性: Lesson 1 - From Structure to Class 本文解释了如何将虚函数表引入具有虚函数的类中: Lesson 4 - Polymorphism |
![]() |
6
0
C++中的类和结构是等价的,除了结构的所有成员在默认情况下都是公共的(默认情况下类成员是私有的)。这确保编译C++编译器中的遗留C代码将按预期工作。 没有什么可以阻止您使用结构中所有的奇特C++特性:
|
![]() |
7
0
当您想将数据传递给C时,为什么不显式地将类的成员分配给结构?这样你就知道你的代码在任何地方都可以工作。 |
![]() |
8
-2
您可能只是从结构派生类,公开或私下。然后,它将在C++代码中正确解决。 |
![]() |
cobb208 · Malloc正在为释放指针引发错误 2 年前 |
![]() |
kernel · 打印结构数组内容时出错 2 年前 |
![]() |
mwitz · 在Rust中无法正确写入结构的函数属性 2 年前 |
![]() |
Ulysses · 无法访问结构字段(Rust) 2 年前 |
![]() |
Tor · 使用Box<None>值初始化struct 2 年前 |
![]() |
Yestin · Golang如何初始化数组结构[duplicate] 2 年前 |