我习惯C的固定尺寸的结构。 不知道C++对象是否被修复。我的意思是总是可以预测对象的大小是多少?在编译期间?和/或运行时间?或者不可能,除非使用sizeof运算符? 我知道它是依赖于硬件平台的。除此之外,还有什么?C++对象是否有固定大小?
回答
当然,C++对象的大小是固定的。如果它不是固定的,而且你创建了一个对象数组,编译器将如何知道需要分配多少空间?
适用于结构的相同规则适用于此处,每种数据的大小加上任何填充以及对于V表指针使用任何额外的4或8字节的虚拟函数,这取决于体系结构的机器。
如果这是完全正确的,那么它就是我想要的。其他人可以确认吗? – Tim
这是错的。 'new int [x]'是反例。数组是单个对象,即使是这样的可变长度数组也是如此。 “编译器如何知道为这些数组分配多少空间?”不是反驳:没有可变长度数组的数组。 – MSalters
它是正确的。如果使用'new int [x]',那么显然你需要一个指针指向堆上动态分配的整数。根据体系结构,这个指针大小会有所不同。当然,这个分配的数据与实际的类或结构大小是分开的。 so 'class Foo { int someInt; int * someInts; } ' 如果在32位系统上,int的大小也是4字节,则总是8个字节。如果在构造函数中有'someints = new int [6400]',并在'Foo'的这个实例上调用'sizeof()',它仍然是8个字节。 –
即使使用C,你也可以使用填充,对齐方式等。也就是说,如果知道成员变量的大小,C++中的struct
/class
的大小通常是可预测的。只有当你开始引入virtual functions
和virtual inheritance
时,这才变得有点模糊。在这种情况下,编译器需要存储一些额外的簿记信息。无论如何,每个对象的大小在编译时是已知的,因此sizeof
运算符是编译时功能(这解释了为什么它可以用于模板元编程。)
C++遵循“不要支付你不用的东西“的原则。如果你所做的只是将类似的数据和函数组合到一个类中,那么你的对象就像它们是具有全局函数的C中的结构一样。如果您需要更高级的功能,那么您需要为每次使用付费。
对象本身的大小可以通过调用sizeof
来检索,并在编译时已知。但是该对象可以管理一些其他资源,并且没有直接了解该资源需要多少内存的方式。
例如,gcc 32位,sizeof(std::vector<T>)
是12(3个指针),但它可能会管理几百万个T
实例,它本身可能很大。
是,否! class
或struct
可以为堆中的数据分配任意大小。成员来管理这将设置一个固定大小的结构。
任何类型都有一个众所周知的大小,点。 (动态内存分配不考虑)
使用型的向前声明的声明,只能是无效的:
class Unknown;
class Failure {
Unknown x;
};
使用指针作出声明有效:
class Unknown;
class Success {
Unknown *x;
};
其实C和C++没有区别。两者都需要知名的尺寸。
- 1. Ruby对象是否有大小限制?
- 2. C++固定大小链表
- 3. C#设置没有固定大小的数组的大小
- 4. 固定大小
- 5. GCC中是否有固定大小的整数?
- 6. 是否有可能迫使JList的固定大小
- 7. 是否有共享对象文件的最大大小?
- 8. 如何确定C#对象的大小
- 9. 固定大小柱
- 10. css,固定大小
- 11. 如何确定MemoryStream是否为固定大小?
- 12. 较大的对象是否较慢(C++)?
- 13. Novacode DocX C#中的固定表大小#
- 14. C(动态)数组(固定大小)
- 15. 固定大小向量的C++向量
- 16. C#中的固定字符串大小#
- 17. 固定大小的阵列不固定
- 18. 是否可以调整文本大小以适应固定大小的div?
- 19. 固定大小的集合中的Java存储对象
- 20. OpenGL ES - 如何将某个对象保持在固定大小?
- 21. 将对象分组到固定大小的集合中
- 22. 对象/对象的大小写约定
- 23. 收藏是一个固定的大小
- 24. Flex的相对大小部件,固定大小的边界
- 25. Swift - 字符串类型的大小是否固定?
- 26. 阵列具有固定间隔大小
- 27. 具有模板参数相关大小的固定大小C数组
- 28. Objective-C中是否存在一个定点小数对象?
- 29. 对象不能反序列化,因为'集合的大小是固定的。'
- 30. 是否可以调整属于Visual Studio的固定对话框的大小?
对象的布局取决于平台特定的ABI。一个例子是http://refspecs.linuxbase.org/cxxabi-1.83.html。 –