带有函数的类的c ++ sizeof()

TCS*_*TCS 22 c++ compiler-construction sizeof

我有一个C++问题.我写了以下课程:

class c
{
    int f(int x, int y){ return x; }
};
Run Code Online (Sandbox Code Playgroud)

class c的sizeof()返回"1".我真的不明白为什么它会返回1.

为了更好地了解正在发生的事情,我添加了另一个功能:

class c
{
     int f(int x, int y){ return x; }
     int g(int x, int y){ return x; }
};
Run Code Online (Sandbox Code Playgroud)

现在以下真的让我感到困惑!sizeof(c)仍为1(!?!?!?!).所以我猜这个函数不会改变类的大小,但为什么??? 为什么尺寸是1?它是编译器特定的吗?

谢谢!:-)

Ker*_* SB 43

该类不包含数据成员,因此它是空的.标准要求每个班级至少有1级,这就是你得到的.(成员函数在物理上并不是一个类,它们实际上只是具有隐藏参数和命名空间和访问控制的自由函数.)

  • @Chris:`sizeof`永远不会返回0.机器上最小的可寻址单元被定义为`char`,并且被定义为`1`.对于拥有地址的一切,它必须是可寻址的.措辞"一切必须有一个地址"和"一切必须有非零大小"之间的唯一区别是空基优化,这不会影响`sizeof`的使用. (3认同)

BЈо*_*вић 11

它的大小为1,因为它不能为0,否则这种类型的两个对象将无法寻址(无法区分其地址)


Den*_*ose 5

成员函数本质上与常规函数相同,它们只是隐藏的this参数.因此,给定类型的每个实例都不需要携带其成员函数的副本; 编译器只是跟踪常规函数,并this为您提供适当的参数.因此,无论给定类型具有多少函数,都不需要更改其大小.当您使用虚函数和诸如此类的东西进行复杂的继承时,这会稍微改变,但最终函数的数量继续对对象的最终大小没有影响.

一个字节的初始大小是因为所有对象都必须占用一些空间,因此您可以保证没有两个对象占用相同的空间.考虑一个数组... a[5]是相同的*(a + 5),并且添加到指针会增加内存地址的大小.如果sizeof(a)0,则数组的所有元素将折叠到同一地址.

一些空间的对象类型是由标准规定的...大小恰好等于一个不是. sizeof(c)在你的情况下可能是23,但没有理由.

为了完整性,子对象的大小可以为零.空基优化允许基类在不需要时不占用任何实际内存.所以sizeof(Base) == sizeof(Derived)可能是真的,即使正式Derived包含Base隐藏在其中的实例.这是标准允许的,但不是由它强制要求......例如,MSVC在某些情况下不使用它.