在这种情况下,Clang似乎不会做空基类优化:
struct A { }; //sizeof(A) == 1 -> OK
struct B : public A { int _intValue; };//sizeof(B) == 4 -> OK, EBCO works here
struct C : public A { B _bValue; }; //sizeof(C) == 8 -> ??? Not OK
似乎g ++的行为方式相同(或类似)。这是正常的吗?我认为EBCO应该来这里。
我是否遗漏了一些会使其在此非法的内容?
答案 0 :(得分:0)
对我而言,差异似乎来自
这一事实&B == &(B._intValue)
VS
&C != &(C._bValue._intValue)
因为&(instance of C) == &(instance of B)
应该是无效的,而&(instance of B) == &first member of (instance of B)
在(B的实例)的第一个成员是基本类型(char,int,...)的情况下有效。
我认为它与EBCO没有任何关系。
答案 1 :(得分:0)
在我看来,clang正在调整到4个字节,因为这可能是您平台上的最佳内存访问。你是如何编译该代码的?