我有一个 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?它是特定于编译器的吗?
该类不包含数据成员,因此它是空的。标准要求每个类至少有大小 1,所以这就是您得到的。 (成员函数实际上并不在类的“内部”,它们实际上只是带有隐藏参数、命名空间和访问控制的自由函数。)
它的大小为1,因为它不能为0,否则该类型的两个对象将无法寻址(无法区分它们的地址)
成员函数本质上与常规函数相同,它们只是获得一个隐藏的
this
参数。 因此,给定类型的每个实例不需要携带其成员函数的副本;编译器只是跟踪常规函数,并为您提供适当的 this
参数。 因此,无论给定类型有多少功能,都不需要更改其大小。 当您使用虚函数等进行复杂的继承时,情况会略有变化,但最终函数的数量仍然对对象的最终大小没有影响。
初始大小为一个字节是因为所有对象都必须占用一些空间,这样可以保证没有两个对象占用相同的空间。 考虑一个数组...
a[5]
与 *(a + 5)
相同,添加到指针会增加对象大小的内存地址。 如果 sizeof(a)
是 0
,则数组的所有元素都会折叠到同一地址。
某些空间的对象类型是由标准强制规定的……大小恰好等于 1 则不是。
sizeof(c)
在你的情况下可能是 23,但没有理由这样做。
为了完整性,子对象的大小可以为零。 空基优化允许基类在不需要时不占用任何实际内存。 所以
sizeof(Base) == sizeof(Derived)
可能是真的,尽管形式上 Derived
包含隐藏在其中的 Base
实例。 这是标准允许的,但不是强制性的……例如,MSVC 在某些情况下不会使用它。
1 表示 1 个字节。原因是方法不存储在对象中。它们被对象使用,但不存储在其中。只有类成员存储在对象中。尝试添加一个普通的 int
成员或其他东西,看看会发生什么。
A:不会。虚拟函数越多,vtable 就越大。 子类越多,vtable 就越多。 如果一个类没有虚函数,那么就不需要 vtable 或(每个对象)vtable 指针。
但是
这些都不会影响“sizeof”。 无论如何,函数本身占用固定的空间。因为你的类是一个“引用变量”,并且根据 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 (c 类)= 1... sizeof (s)= 8, sizeof (objs)= 8, sizeof (struct s)= 8...
还要注意“结构”和“类”之间的区别。
这里有更多信息:
http://www.geekinterview.com/question_details/42847