0

在 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 的成员函数?

我只能假设额外的字节是编译器将 char* 添加到 A 的名称“A”,但任何其他想法都会有所帮助。

4

2 回答 2

4

sizeof(A) 不能为 0,因为对象的每个部分都应该是“可寻址的”(即当我们使用运算符 & 时应该有不同的地址)

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" 
}
于 2009-05-11T23:33:31.697 回答
2

不幸的是,您没有提到编译器。

无论如何,在您发布的代码中,A 类是“空基类优化”的候选者。这是 C++ 标准的一部分,它说可以优化没有成员变量的基类以不占用字节。

B 必须按 C++ 标准占用空间,因为它至少包含一个成员(即 obj_A)。

您可以通过调用 do_something() 直接从 B 中访问 A 的成员函数。不需要魔法。

于 2009-05-11T22:44:30.967 回答