c++ - C++类对象的总内存

标签 c++ memory memory-management 64-bit

为什么下面这段代码的答案是 24?也就是下面的X类对象的总大小是多少,24字节?我使用的是 64 位机器。

#include <bits/stdc++.h>
using namespace std;
class X
{
    vector <bool> f;
    int b;
    public:
    X(){
        f.push_back(true);
        }
};
int main(){
    X ob;
    cout<<sizeof(ob);
    return 0;
}

最佳答案

That is, how is the total size of the object of following class X, 24 bytes? I'm using 64-bit machine.

C++ 几乎不保证类型大小,也不保证标准容器的内存布局。因此,对于此类问题,说明您的编译器和调用它的选项也很重要。

class X
{
    vector <bool> f;
    int b;
    public:
    X(){
        f.push_back(true);
        }
};

您可以查看 sizeof(int) 的单个结果和 sizeof(vector<bool>) .他们将可能揭示以下内容:

  • 8 个字节表示 int b .
  • 16 个字节表示 vector<bool> f .

vector<bool> 的 16 个字节更难分析。 可以在对象中存储一些东西,例如:

  • std::allocator<bool> 的实例当您构建 vector 时,您“无形地”通过默认参数传递。
  • 指向数据占用的动态分配内存开始的指针,表示 vector 的bool元素。
  • 指向该内存末尾的指针(用于恒定时间 capacity() 调用)。
  • 指向动态分配内存中最后一个元素的指针(用于恒定时间 size() 调用)。
  • 当前元素计数或当前容量计数(用于恒定时间 sizecapacity() 调用)。

如果您想确定地知道,您可能可以查看您的实现的头文件,看看您的编译器是如何布局的 std::vector<bool>在内存中。

请注意 std::vector<bool> 的内存布局可以不同于所有其他std::vector由于 special optimisations .例如,在我装有 MSVC 2013 的机器上,只用 cl /EHsc /Za /W4 stackoverflow.cpp 编译, sizeof(std::vector<bool>)是 16 而 sizeof(std::vector<int>)是 12 [*]

由于实现内部的头文件可能很难阅读,另一种方法是在调试器中运行程序并检查那里的对象。以下是 Visual Studio Express 2013 的示例屏幕截图:

Memory layout of <code>std::vector<bool></code> and <code>std::vector<int></code> in MSVC 2013

如您所见,sizeof(std::vector<bool>)这里来自三次sizeof(unsigned int*)对于指向第一个元素的指针,最后一个元素和容量在动态分配的内存中结束,再加上一个额外的 sizeof(unsigned int)对于元素计数,由于上述对 std::vector<bool> 的特殊优化,这是必需的,这意味着计算指向第一个元素和最后一个元素的指针之间的差异可能不一定会向外部代码揭示 vector 表示的元素数量。

std::vector<int>不需要那种特殊处理,这就解释了为什么它更小。

继承std::_Container_base0由于 Empty base optimization 显然没有考虑在内.


综合考虑,这都是相当复杂的事情。但这就是标准库实现者的世界!请记住,您在头文件中看到的所有内容都是严格内部的。例如,您不能假设 std::_Container_base0 的存在以任何方式在您自己的代码中。假装它不存在。

回到你原来的问题,最重要的一点是你的编译器可能会布置一个 std::vector<bool>只要它根据 C++ 标准对外界正确运行,它就可以以任何方式运行。它也可以选择不优化 std::vector<bool>根本。在不了解您的编译器的情况下,我们无法告诉您更多信息。它在 64 位机器上运行的信息是不够的。


[*] <子> std::vector<bool>应该是一个节省空间的优化,但显然在这个实现中,这只涉及动态分配的元素占用的空间,而不是 vector 本身的静态大小。

关于c++ - C++类对象的总内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32931360/

相关文章:

C : Increase Dynamic Array by one in a loop

c++ - 仅分析我需要使用 VS2010 的命名空间

c++ - 读取 filebuf 的等价物?

ruby - 使用交换时进程退出时出现 Errno::ENOMEM

c++ - "Right"解除分配 std::vector 对象的方法

C - Calloc 而不是 Malloc 来节省线路?

c++ - 在不单独绘制每个 channel 的情况下移动颜色 channel ?

c++ - 如何解决转发的 WinAPI 的循环依赖?

类及其派生类的 C++ 内存池

java - 为什么Java不支持自动堆扩容?