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

问题描述 投票:0回答:7

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

c++ sizeof
7个回答
49
投票

该类不包含数据成员,因此它是空的。标准要求每个类至少有大小 1,所以这就是您得到的。 (成员函数实际上并不在类的“内部”,它们实际上只是带有隐藏参数、命名空间和访问控制的自由函数。)


12
投票

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


7
投票

成员函数本质上与常规函数相同,它们只是获得一个隐藏的

this
参数。 因此,给定类型的每个实例不需要携带其成员函数的副本;编译器只是跟踪常规函数,并为您提供适当的
this
参数。 因此,无论给定类型有多少功能,都不需要更改其大小。 当您使用虚函数等进行复杂的继承时,情况会略有变化,但最终函数的数量仍然对对象的最终大小没有影响。

初始大小为一个字节是因为所有对象都必须占用一些空间,这样可以保证没有两个对象占用相同的空间。 考虑一个数组...

a[5]
*(a + 5)
相同,添加到指针会增加对象大小的内存地址。 如果
sizeof(a)
0
,则数组的所有元素都会折叠到同一地址。

某些空间的对象类型是由标准强制规定的……大小恰好等于 1 则不是。

sizeof(c)
在你的情况下可能是 23,但没有理由这样做。

为了完整性,子对象的大小可以为零。 空基优化允许基类在不需要时不占用任何实际内存。 所以

sizeof(Base) == sizeof(Derived)
可能是真的,尽管形式上
Derived
包含隐藏在其中的
Base
实例。 这是标准允许的,但不是强制性的……例如,MSVC 在某些情况下不会使用它。


1
投票

1 表示 1 个字节。原因是方法不存储在对象中。它们被对象使用,但不存储在其中。只有类成员存储在对象中。尝试添加一个普通的 int 成员或其他东西,看看会发生什么。

    


0
投票
sizeof(char)==1 总是,因为 char 是一个字节,sizeof 返回一个数字 字节数。 (但是,一个字节不一定是八位。)

绝对正确。 因此,术语“八位字节”(用于区分
is

恰好是 8 位的东西与更常用的术语“字节”)。 有关更多信息,请查看 IEEE 1541:

http://en.wikipedia.org/wiki/IEEE_1541


-1
投票
问:虚函数是否会占用每个对象的空间,从而增加对象的大小?

A:不会。虚拟函数越多,vtable 就越大。 子类越多,vtable 就越多。 如果一个类没有虚函数,那么就不需要 vtable 或(每个对象)vtable 指针。

但是

这些都不会影响“sizeof”。 无论如何,函数本身占用固定的空间。

因为你的类是一个“引用变量”,并且根据 MSDN:“即使对于空类,sizeof 运算符也不会产生 0。”

-4
投票
示例:

#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

© www.soinside.com 2019 - 2024. All rights reserved.