为什么bool占用的内存和int占用的内存一样多?C++
Why does a bool appear to take up as much memory as an int? C++
当我在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,这可能会导致性能下降,在某些体系结构上甚至会导致崩溃。
您可以使用编译器特定的杂注和属性显式关闭结构封装,但您不希望这样做。如果内存是一个问题,请考虑使用数组结构而不是结构数组。
因为内存对齐。在这种情况下,bool
在struct
到int
中被对准。意思是——还有一些多余的未使用字节。
这意味着,sizeof( your_struct )
将给你2 * sizeof( int )
。
你可以用它做一些实验——检查里面有更多bool
的sizeof
和struct
,通过重新排列元素来再次检查大小,等等。这些都是了解发生了什么的有用实验。此外,对结构填充和内存对齐的研究将对您非常有用。
这与结构对齐有关。在某些平台上,如果内存是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;
}
- 将字符串存储在c++中的稳定内存中
- C++ 指针的内存地址和指向数组的内存地址如何相同?
- Win32编译器选项和内存分配
- 当vector是tje全局变量时,c++中vector的内存管理
- 带内存和隔离功能的SQLite
- 是否可以通过C++扩展强制多个python进程共享同一内存
- 迭代时从向量和内存中删除对象
- 在C++中打印指向不同基元数据类型的指针的内存地址
- 这个指针和内存代码打印是什么?我不知道是打印垃圾还是如何打印我需要的值
- 多个文件的内存分配错误"在抛出 'std :: bad_alloc' what (): std :: bad_alloc 的实例后终止调用" [C++]
- 为什么示例代码访问IUnknown中已删除的内存
- 如何在C++类内存结构中创建"spacer"?
- 从构造函数抛出异常时如何克服内存泄漏
- malloc() 可能出现内存泄漏
- C# 或 C++ ;可以像在CE中一样修改内存吗?
- 为什么bool占用的内存和int占用的内存一样多?C++
- 像访问文件流一样访问内存块(/ C/ c++数组)
- 动态内存分配——所有对象都是一样的
- 如何将所有值保存在内存中,并使用命令检查它们,就像在 Matlab 中调试一样
- 如何像直接访问文件一样使用内存:类似于read和fwrite函数