【发布时间】:2018-02-26 06:23:56
【问题描述】:
当我在 c++ 中做 sizeof 时,我一定会得到“整个对象”吗?我问是因为我即将使用 memcpy 将对象复制到内存的其他区域(可能从一开始就是一个愚蠢的想法,对吧?)。
我担心的是我可能无法获得整个对象,而只能获得属于它现在被投射到的类的部分。这有什么意义还是我很困惑?
编辑示例
class A{ public: int a = 123; };
class B: public A{ public: int b = 321; };
class C : public B{ public: int c = 333; };
C c_ = C();
B b_ = C();
A a_ = C();
std::cout << sizeof(a_) << " , " << sizeof(b_) << " , " << sizeof(c_) << std::endl;
似乎给了我 4,8,12。
我想我需要进行动态转换来弄清楚如何获取我在每种情况下构造为“C”类的“整体”对象?
【问题讨论】:
-
您是否尝试打印这些尺寸?还是使用调试器?当然
sizeof(b)比sizeof(a大(可能大4 个字节) -
可能是因为 填充。查看非常相关的(如果不重复?)Why isn't sizeof for a struct equal to the sum of sizeof of each member?
-
是的,在 C++ 中使用
memcpy通常是一个非常糟糕的主意,除了普通的旧数据 (POD) 结构。 -
不考虑“铸造”而是考虑对象的实际类型可能会有所帮助。
a的类型为A。b的类型为B。A对象是如何创建的并不重要,它的sizeof是一个常量。 -
memcpy如果对象是 TriviallyCopyable(例如标量、数组、C 兼容结构),则可以。对于不是 TriviallyCopyable 的对象,除非您确切知道自己在做什么,否则您很有可能会遇到未定义的行为。