我有一个C ++问题。 我写了以下课程:
class c
{
int f(int x, int y){ return x; }
};
c类的sizeof()返回“1”。 我真的不明白为什么它会返回1。
为了更好地了解发生了什么,我添加了另一个功能:
class c
{
int f(int x, int y){ return x; }
int g(int x, int y){ return x; }
};
现在以下真的让我感到困惑! sizeof(c)仍为1(!?!?!?!)。 所以我猜这个函数不会改变类的大小,但为什么???为什么尺寸是1?它是编译器特定的吗?
谢谢! : - )
答案 0 :(得分:43)
该类不包含数据成员,因此它是空的。标准要求每个班级至少有1级,这就是你得到的。 (成员函数在物理上并不属于某个类,它们实际上只是具有隐藏参数和命名空间以及访问控制的自由函数。)
答案 1 :(得分:11)
它的大小为1,因为它不能为0,否则此类型的两个对象将无法寻址(无法区分其地址)
答案 2 :(得分:5)
成员函数基本上与常规函数相同,只是得到一个隐藏的this
参数。因此,给定类型的每个实例都不需要携带其成员函数的副本;编译器只跟踪常规函数,并为您提供适当的this
参数。因此,无论给定类型具有多少函数,都不需要更改其大小。当你使用虚函数和诸如此类的东西进行复杂的继承时,这会稍微改变,但最终函数的数量继续对对象的最终大小没有影响。
一个字节的初始大小是因为所有对象都必须占用一些空间,因此您可以保证没有两个对象占用相同的空间。考虑一个数组... a[5]
与*(a + 5)
相同,添加到指针会增加内存地址的大小。如果sizeof(a)
为0
,则数组的所有元素都会折叠到同一地址。
某些空间的对象类型是由标准规定的......大小恰好等于一个不是。在你的情况下sizeof(c)
可能是23,但没有理由。
为完整起见,子对象的大小可能为零。空基优化允许基类在不需要时不占用任何实际内存。所以sizeof(Base) == sizeof(Derived)
可能是正确的,即使正式Derived
包含隐藏在其中的Base
实例。这是标准允许的,但不是由它强制要求......例如,MSVC在某些情况下不使用它。
答案 3 :(得分:1)
1表示1个字节。而共鸣是方法不存储在对象中。它们由 对象使用,但不存储在其中。只有类成员存储在对象中。尝试添加普通int
成员或其他内容,看看会发生什么。
答案 4 :(得分:0)
sizeof(char)== 1总是,因为char是一个字节而sizeof返回一个数字 的字节数。 (但是,一个字节不一定恰好是8位。)
绝对正确。因此,术语“八位字节”(用于区分 与正常使用的术语“字节”完全相同的8位)。
有关详细信息,请参阅IEEE 1541:
答案 5 :(得分:-1)
问:虚拟函数是否基于每个对象占用空间,因此会增加对象的大小?
答:不会。虚函数越多,vtable就越大。子类越多,vtable就越多。如果一个类没有虚函数,则不需要vtable或(每个对象)vtable指针。
但是 none 会影响“sizeof”。无论如何,函数本身都占用了固定的空间。
答案 6 :(得分:-4)
因为你的类是一个“引用变量”,并且,根据MSDN:“即使对于一个空类,sizeof运算符也永远不会产生0。”
实施例:
#include <stdio.h>
class c
{
public:
int f(int x, int y){ return x; }
int g(int x, int y){ return x; }
};
struct s
{
int f;
int g;
};
int
main (int argc, char *argv[])
{
c objc;
s objs;
printf ("sizeof (c)= %d, sizeof (objc)= %d, sizeof (class c)= %d...\n",
sizeof (c), sizeof (objc), sizeof (class c));
printf ("sizeof (s)= %d, sizeof (objs)= %d, sizeof (struct s)= %d...\n",
sizeof (s), sizeof (objs), sizeof (struct s));
return 0;
}
结果:
sizeof (c)= 1, sizeof (objc)= 1, sizeof (class c)= 1... sizeof (s)= 8, sizeof (objs)= 8, sizeof (struct s)= 8...
请注意“struct”和“class”之间的区别。
以下是更多信息: