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

时间:2011-07-01 19:15:03

标签: c++ compiler-construction sizeof

我有一个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?它是编译器特定的吗?

谢谢! : - )

7 个答案:

答案 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:

http://en.wikipedia.org/wiki/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”之间的区别。

以下是更多信息:

http://www.geekinterview.com/question_details/42847