2013-10-29 165 views
1

我习惯C的固定尺寸的结构。 不知道C++对象是否被修复。我的意思是总是可以预测对象的大小是多少?在编译期间?和/或运行时间?或者不可能,除非使用sizeof运算符? 我知道它是依赖于硬件平台的。除此之外,还有什么?C++对象是否有固定大小?

+0

对象的布局取决于平台特定的ABI。一个例子是http://refspecs.linuxbase.org/cxxabi-1.83.html。 –

回答

3

当然,C++对象的大小是固定的。如果它不是固定的,而且你创建了一个对象数组,编译器将如何知道需要分配多少空间?

适用于结构的相同规则适用于此处,每种数据的大小加上任何填充以及对于V表指针使用任何额外的4或8字节的虚拟函数,这取决于体系结构的机器。

+0

如果这是完全正确的,那么它就是我想要的。其他人可以确认吗? – Tim

+0

这是错的。 'new int [x]'是反例。数组是单个对象,即使是这样的可变长度数组也是如此。 “编译器如何知道为这些数组分配多少空间?”不是反驳:没有可变长度数组的数组。 – MSalters

+2

它是正确的。如果使用'new int [x]',那么显然你需要一个指针指向堆上动态分配的整数。根据体系结构,这个指针大小会有所不同。当然,这个分配的数据与实际的类或结构大小是分开的。 so 'class Foo { int someInt; int * someInts; } ' 如果在32位系统上,int的大小也是4字节,则总是8个字节。如果在构造函数中有'someints = new int [6400]',并在'Foo'的这个实例上调用'sizeof()',它仍然是8个字节。 –

2

即使使用C,你也可以使用填充,对齐方式等。也就是说,如果知道成员变量的大小,C++中的struct/class的大小通常是可预测的。只有当你开始引入virtual functionsvirtual inheritance时,这才变得有点模糊。在这种情况下,编译器需要存储一些额外的簿记信息。无论如何,每个对象的大小在编译时是已知的,因此sizeof运算符是编译时功能(这解释了为什么它可以用于模板元编程。)

C++遵循“不要支付你不用的东西“的原则。如果你所做的只是将类似的数据和函数组合到一个类中,那么你的对象就像它们是具有全局函数的C中的结构一样。如果您需要更高级的功能,那么您需要为每次使用付费。

+0

你的意思是每个虚拟函数的使用会创建一个更多的项目,其中可能有指针和其他系统/应用程序变量/指针?这是否意味着在使用虚函数后,您使用sizeof的运算符会看到区别吗? 这个对象的另一个对象怎么样? 功能大小是多少?函数指针的大小? – Tim

+1

该对象将需要存储一个指向函数指针表(称为虚函数表或vtable)的指针。但是,实际上将该指针存储在结构中的指针实际上是定义的,然而,它可以与任何对象相关的概念布局。 – bstamour

3

对象本身的大小可以通过调用sizeof来检索,并在编译时已知。但是该对象可以管理一些其他资源,并且没有直接了解该资源需要多少内存的方式。

例如,gcc 32位,sizeof(std::vector<T>)是12(3个指针),但它可能会管理几百万个T实例,它本身可能很大。

1

是,否! classstruct可以为堆中的数据分配任意大小。成员来管理这将设置一个固定大小的结构。

2

任何类型都有一个众所周知的大小,点。 (动态内存分配不考虑)

使用型的向前声明的声明,只能是无效的:

class Unknown; 
class Failure { 
    Unknown x; 
}; 

使用指针作出声明有效:

class Unknown; 
class Success { 
    Unknown *x; 
}; 

其实C和C++没有区别。两者都需要知名的尺寸。