编译器构造-带有函数的类的c++sizeof()

compiler construction - c++ sizeof() of a class with functions

本文关键字:c++sizeof 函数 编译器      更新时间:2023-10-16

我有一个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成员或其他什么,看看会发生什么。

sizeof(char(==1,因为char是一个字节,sizeof返回一个数字字节。(然而,一个字节不一定正好是八位。(

绝对正确。因此,术语"八位字节"(将恰好为8位的东西与更常用的术语"字节"区分开来(。

有关更多信息,请参阅IEEE 1541:

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

Q: 虚拟函数是否会在每个对象的基础上占用空间,从而增加对象的大小?

A: 不。虚拟函数越多,vtable就越大。子类越多,vtables就越多。如果一个类没有虚拟函数,那么就不需要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,size of(class c(=1。。。sizeof(s(=8,sizeof(objs(=8、sizeof(structs(=8…

还要注意"struct"answers"class"之间的区别。

以下是更多信息:

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