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级,这就是你得到的.(成员函数在物理上并不是一个类,它们实际上只是具有隐藏参数和命名空间和访问控制的自由函数.)
成员函数本质上与常规函数相同,它们只是隐藏的this参数.因此,给定类型的每个实例都不需要携带其成员函数的副本; 编译器只是跟踪常规函数,并this为您提供适当的参数.因此,无论给定类型具有多少函数,都不需要更改其大小.当您使用虚函数和诸如此类的东西进行复杂的继承时,这会稍微改变,但最终函数的数量继续对对象的最终大小没有影响.
一个字节的初始大小是因为所有对象都必须占用一些空间,因此您可以保证没有两个对象占用相同的空间.考虑一个数组... a[5]是相同的*(a + 5),并且添加到指针会增加内存地址的大小.如果sizeof(a)是0,则数组的所有元素将折叠到同一地址.
一些空间的对象类型是由标准规定的...大小恰好等于一个不是. sizeof(c)在你的情况下可能是23,但没有理由.
为了完整性,子对象的大小可以为零.空基优化允许基类在不需要时不占用任何实际内存.所以sizeof(Base) == sizeof(Derived)可能是真的,即使正式Derived包含Base隐藏在其中的实例.这是标准允许的,但不是由它强制要求......例如,MSVC在某些情况下不使用它.