在C ++中,问题很简单。
我有2个类,其中一个包含另一个作为其实现的一部分。
struct A
{
void do_something()
{
};
};
struct B
{
A obj_A;
void hello_world()
{
};
};
现在的问题是,当我执行sizeof(B)和类型B的对象时,如果A是B的一部分,则结构B大一个字节.A是100%仅包括非虚拟成员(没有虚拟)需要表)并且不需要进行typeid检查。是否有任何方法(如编译器指令)从B中完全删除不需要的字节但仍然通过B访问A的成员函数?
我只能假设额外的字节是编译器为A的名字“A”添加了char *,但任何其他想法都会有所帮助。
答案 0 :(得分:4)
sizeof(A)不能为0,因为对象的每个部分都应该是“可寻址的”(当我们使用operator&时应该有不同的地址)
struct A
{
};
struct B
{
A m_a1;
A m_a2;
};
void test()
{
B b;
A* pa1 = &b.m_a1;
A* pa2 = &b.m_a2;
// "pa1" need to be different from "pa2"
}
答案 1 :(得分:2)
不幸的是,你没有提到编译器。
无论如何,在您发布的代码中,A类是“空基类优化”的候选者。这是C ++标准的一部分,它说没有成员变量的基类可以被优化掉而不占用任何字节。
B必须通过C ++标准占用空间,因为它至少包含一个成员(即obj_A)。
您可以通过调用do_something()直接从B中访问A的成员函数。不需要魔法。