c++ - 如何确定 C++ 中对象的大小?

标签 c++ class memory size memory-management

例如,假设我有一个 Temp 类:

class Temp
{
    public:
        int function1(int foo) { return 1; }
        void function2(int bar) { foobar = bar; }

    private:
        int foobar;
};

当我创建一个 Temp 类的对象时,我将如何计算它需要多少空间,以及它在内存中的表示方式(例如| foobar 为 4 个字节| function1 为 8 个字节 | 等 | )

最佳答案

对于一阶近似,对象的大小是其组成数据成员大小的总和。你可以肯定它永远不会小于这个。

更准确地说,编译器有权在数据成员之间插入填充空间,以确保每个数据成员满足平台的对齐要求。一些平台对对齐非常严格,而另一些(x86)则更宽容,但在正确对齐的情况下会表现得更好。因此,即使是编译器优化设置也会影响对象大小。

继承和虚函数增加了额外的复杂性。正如其他人所说,您的类的成员函数本身并不占用“每个对象”空间,但是该类接口(interface)中虚函数的存在通常意味着虚表的存在,本质上是用于查找函数指针的表动态解析正确的函数实现以在运行时调用。虚拟表 (vtbl) 通常通过存储在每个对象中的指针来访问。

派生类对象还包括其基类的所有数据成员。

最后,访问说明符(public、private、protected)赋予编译器一定的数据成员打包余地。

简短的回答是 sizeof(myObj) 或 sizeof(MyClass) 总是会告诉您对象的正确大小,但其结果并不总是容易预测。

关于c++ - 如何确定 C++ 中对象的大小?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/937773/

相关文章:

c++ - 将 3 个值的数组打包到缓冲区中

c++ - 埃拉托色尼筛法 C++

c++ - 函数的功能无法识别输入参数

c++ - 错误 C2601 : 'main' : local function definitions are illegall - MS VS 2013 Compiler

iphone - CALayer 崩溃、内存问题

android - Android中可用于内存测试的软件测试技术有哪些?

c++ - 为什么我应该在关闭套接字之前使用 shutdown()?

类中的c++模板

python - 设置属性和调用就地变异方法之间的区别?

python - 如何在类及其方法中使用自参数、@staticmethod 关键字