为什么bool占用的内存和int占用的内存一样多?C++

Why does a bool appear to take up as much memory as an int? C++

本文关键字:内存 一样 C++ int bool 为什么      更新时间:2023-10-16

当我在dev-cpp上运行这个程序时,任务管理器说它大约是79MB。gnu c++4.7的Codeforces表示它是79112千字节的

#include<stdio.h>
const int N=10010,K=1010;
struct TPos
{
    int charge;
    bool ex;
    TPos()
    {
        charge=1<<30;
        ex=false;    
    }  
};
TPos d[N][K];
int main()
{
    while(1);
    return 0;
}

但当ex parameter被评论时:

#include<stdio.h>
const int N=10010,K=1010;
struct TPos
{
    int charge;
    //bool ex;
    TPos()
    {
        charge=1<<30;
        //ex=false;    
    }  
};
TPos d[N][K];
int main()
{
    //while(1);
    return 0;
}

它只有39536 KB。我认为布尔值应该使用一个字节。为什么它的尺寸是原来的两倍?

除非打包一个结构,否则它总是占用可除以单词大小的内存(因为内存联盟)。例如,您可以通过在gcc中使用__attribute__(packed)来打包结构。另请参见此处。封装一个结构可能会减少所需的内存,但几乎肯定会减慢执行速度。

布尔是一个字节,但您在这里看到的是结构封装。

您的结构包含一个int,因此编译器会自动将结构与int的大小对齐,以确保它在数组中正确对齐。否则,数组的第二个元素将在不正确对齐的地址上使用int,这可能会导致性能下降,在某些体系结构上甚至会导致崩溃。

您可以使用编译器特定的杂注和属性显式关闭结构封装,但您不希望这样做。如果内存是一个问题,请考虑使用数组结构而不是结构数组。

因为内存对齐。在这种情况下,boolstructint中被对准。意思是——还有一些多余的未使用字节。

这意味着,sizeof( your_struct )将给你2 * sizeof( int )

你可以用它做一些实验——检查里面有更多boolsizeofstruct,通过重新排列元素来再次检查大小,等等。这些都是了解发生了什么的有用实验。此外,对结构填充和内存对齐的研究将对您非常有用。

这与结构对齐有关。在某些平台上,如果内存是4字节的倍数,则更容易寻址内存。编译器可能会填充您的结构,使其更易于使用。如果我是正确的,你可以再添加一个bool,你将不会看到额外的空间被使用。

检查编译器选项以了解如何禁用它,但请注意,性能可能会受到影响。

的确,bool通常使用一个字节(但并非必须如此)。

然而,C和C++也可以在结构中添加填充,即空格,以进行对齐。这有点复杂,但基本上,当变量在特定的边界上对齐时,内存访问会变得更快。

在这种情况下,添加额外的bool可能会将结构大小从4个字节(仅在int中)增加到8个字节,因此允许结构在数组中很好地对齐。当然,这一切都取决于您的编译器,但您可以使用sizeof(TPos)进行检查。

大多数编译器都有扩展,可以请求填充特定的结构而不是,即使这会使它们的使用速度变慢——您可能需要对此进行研究。

您可以使用大小说明符来减小对象的大小(请参阅以下代码中的:)。如果你真的不需要charge的完整int大小,这可能看起来像TPosB:

#include <iostream>
#include<stdio.h>
struct TPosB
{
    int charge : sizeof(int)-1;
    bool ex : 1;
    TPosB()
    {
        charge=1 << sizeof(int)-2;
        ex=false;
    }
};
TPosB b;
struct TPos
{
    int charge;
    bool ex;
    TPos()
    {
        charge=1<<30;
        ex=false;    
    }  
};
TPos a;
int main()
{
    std::cout << "sizeof(int)" << sizeof(int);
    std::cout << "nsizeof(a)=" << sizeof(a);
    std::cout << "nsizeof(b)=" << sizeof(b);
    return 0;
}