8 bool vs 1 int
8 bool vs 1 int
bool
在C++中占用1个字节。但是,为什么bool[8]
需要8个字节而不是1个字节呢?一个字节有足够的空间容纳8位。
我使用-Os
标志用GCC编译了这个:
#include <iostream>
using namespace std;
class Foo
{
public:
bool m_bool[8];
};
int main ()
{
cout << "Size: " << sizeof(Foo) << " byte(s) " << endl;
return 0;
}
它返回"Size:8 byte(s)"。
有没有优化它的方法?
编译器必须允许您获取单个布尔的地址,例如
Foo foo;
bool* p = &foo.m_bool[0];
bool* q = &foo.m_bool[1];
如果bools被打包了,p和q会是什么?
不能保证第一个bool的大小为1。第二,当你把8个组合在一起时,为什么你仍然期望结果是1?
8 x 1=8
由于我在上面的评论中没有看到它,我将在回答"有没有优化它的方法?"时提到一个概念,以防您还没有使用它。它被称为位掩码,其中您基本上使用int作为一系列位,并使用逐位运算符来计算整数中的各个位。
为了方便地适当地设置字符串中的位,通常定义一些语义命名的常量,并将其设置为2的幂值(这样它们只"翻转"一位。您可以很容易地使用bitshift运算符来明确翻转的位:
#define IS_ADMIN = 1<<0;
#defing CLEAR_CACHE = 1<<1;
然后你测试这样的管理员:
if(userSettings & IS_ADMIN) { ...
这是一篇起点维基文章
"有办法优化它吗?"
你确定优化是有益的吗?您可以使用枚举作为标志而不是布尔来将它们全部存储在一个字节中。
如何在C++中使用枚举作为标志?
有没有优化它的方法?
您可以使用所谓的位字段来实现这一点。位字段值不能取其地址。
相关文章:
- 重载函数 int vs double
- 杀死幻数:"const int" vs "constexpr int"(或者最后没有区别)
- C++ vector::size_type:有符号与无符号;int vs. long
- 缩小从"int"(常量表达式)到"无符号int"的转换 - MSVC vs gc
- 使用双大括号的矢量初始化:std::string vs int
- 返回对int vs vs返回c 函数中的int的引用
- Efficiency of int vs int[]
- Null指针异常(int Vs char)
- 8 bool vs 1 int
- static const std::map<string, int> vs if-elseif
- #定义MY_INT VS常量INT MY_INT
- const int*& vs typedef int* IntPtr
- C/C++ int[] vs int*(指针与数组表示法).有什么区别
- 为什么 int vs 布尔类型检查失败
- 'for' 循环中的 'int i = 0' vs. 'int i(0)'(赋值与初始化计数变量)
- std::multiset vs. std::<int>map<int, std::size_t> 用于保留多个可重复的整数值
- 将 double 分配给 const int&vs int to const int&
- 使用const初始化constexpr,--int vs float
- int vs unsigned int vs size_t
- std::map<int, int> vs. 向量的向量