C++中声明一系列类对象时的内存分配

问题描述 投票:0回答:1
class Data {
    double a, b, c;
};

int main() {
    Data x, y, z;
    cout << sizeof(x) << endl;
    cout << &x << " " << &y << " " << &z << endl;
}

上述代码的输出是:

24
0x7ffd911f5640 0x7ffd911f5660 0x7ffd911f5680

这是我的问题: Data 类对象只需要 24 个字节的空间,那么为什么编译器为每个对象分配 32 个字节(

0x7ffd911f5640
0x7ffd911f5660
之间的内存空间)?

c++ class oop memory-management ooad
1个回答
0
投票

在 C++ 中,内存对齐和填充用于确保高效的内存访问,特别是对于像 double 这样可能需要特定对齐的类型。这就是为什么分配的内存看起来比类中各个成员的大小总和还要多。

在您的 Data 类中,总大小可能确实达到 24 个字节(双精度 a、双精度 b 和双精度 c)。然而,由于内存对齐和填充,实际的内存分配可能会更大,以确保内存空间内变量的正确对齐,这可能会导致内存占用略有增加。

观察到的内存地址(0x7ffd911f5640、0x7ffd911f5660、0x7ffd911f5680)表明连续对象之间存在 0x20(十进制 32)的差异。这表明每个对象需要 8 个字节的对齐或填充要求,使得每个对象在内存中占用 32 个字节,尽管 Data 的实际大小为 24 个字节。

这种填充是由编译器引入的,以确保 CPU 可以有效地访问内存中的数据,特别是在处理需要特定对齐的类型(如 double)时。

© www.soinside.com 2019 - 2024. All rights reserved.