为什么bool似乎占用了与int相同的内存?C++

use*_*963 5 c++ memory boolean

当我在dev cpp运行这个程序时,任务管理器说它大约是79 MB.使用gnu c ++ 4.7的代码表示它是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;
}
Run Code Online (Sandbox Code Playgroud)

但是当ex parametr被评论时:

#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;
}
Run Code Online (Sandbox Code Playgroud)

它只有39536 KB.我认为布尔值应该使用一个字节.为什么它的尺寸加倍?

izo*_*ica 8

除非你打包一个结构,否则它总是占用可被字大小分割的内存(因为内存对齐).__attribute__(packed)例如,在gcc中使用打包结构.另见这里.打包结构可能会减少所需的内存,但几乎肯定会减慢执行速度.

  • 是的,这是可能的,但可能不是一个好的做法,因为它可能会破坏对齐并可能增加虚假缓存行冲突的机会.另见 - http://digitalvampire.org/blog/index.php/2006/07/31/why-you-shouldnt-use-__attribute__packed/ (2认同)

Ebo*_*ike 5

Bool是一个字节,但你在这里看到的是结构打包.

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

您可以使用特定于编译器的编译指示和属性显式关闭结构打包,但您不希望这样做.如果需要关注内存,请考虑使用数组结构而不是结构数组.