编译器构造-带有函数的类的c++sizeof()
compiler construction - c++ sizeof() of a class with functions
我有一个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
- 为什么 sizeof(ar)/ sizeof(ar[0]) 在传递给函数时无法在向量上正常工作?
- sizeof 函数如何在带和不带位字段的结构上工作?(填充)
- 如何将数组传递给使用 sizeof 的函数?
- 为什么sizeof函数在这里不能正常工作
- sizeof(函数)有意义吗?
- sizeof() 运算符在 C++ 中的函数
- 为什么在 sizeof() 函数中与 * 运算符一起使用和不使用 * 运算符时,指向结构变量的指针大小会有所不同?
- 有人可以告诉我为什么我在这里使用sizeof()函数无法找到数组的长度
- 内联函数,等于 "sizeof expression" ,但返回一个有符号值
- 字符串数组上的C sizeof将传递给函数时未返回预期结果
- 在可变参数模板中使用 sizeof 运算符跳过递归结束的函数
- 如果 T 是一个函数,则不要对 T 使用 sizeof
- 在结构的构造函数中使用sizeof
- 为什么对于某些数组A,sizeof(A)在函数内部不起作用
- 字符常量和函数名称的 sizeof() 背后的逻辑
- 为什么 sizeof 运算符无法在函数模板中工作
- 为什么函数上的typeid是可以的,而sizeof则不是
- sizeof函数在函数中不起作用
- 有人能向我解释一下为什么sizeof函数在下面的代码中返回不同的值
- 正确使用sizeof()函数