是否可以在c ++中创建一个占用少于一个字节内存的类型?

ElC*_*ado 6 c++ byte types primitive-types

对于我的计算,我只需要使用7位空间,所以我使用的是char类型.但是我想知道是否可以声明我自己的类型使用少于一个字节的内存?

Dar*_*ust 12

并不是的.在结构内部,您可以使用位字段.因此,如果您知道您需要一定数量的固定条目,这将是一种节省一些比特的方法(但请注意,结构将始终填充到至少下一个整数字节).另请注意,由于"普通"CPU无法处理小于八位位组/字节的数据,因此对这些位字段值的访问可能会更慢,因为编译器必须生成额外的指令来获取/存储值"在中间".因此,为了节省一些比特,你必须花费一些CPU时间.

C++ 11标准说,在章节1.7的C++内存模型(重点煤矿):

C++内存模型中的基本存储单元是字节.一个字节至少足以包含基本执行字符集(2.3)的任何成员和Unicode UTF-8编码形式的八位代码单元,并由连续的位序列组成,其数量为实施 - 定义.

换句话说:C++中最小的可寻址单元至少为8位宽.

旁注:如果您想知道:有些机器像DSP一样只能处理大于8位的单元 ; 对于这样的机器,编译器可以将"字节"定义为例如16位宽.


Ste*_*hen 7

即使您尝试创建大小为1的位集,也会消耗一个字节.因此,无法在C++中创建小于一个字节的类型

#include <iostream>       // std::cout
#include <string>         // std::string
#include <bitset>         // std::bitset

int main ()
{
  std::bitset<1> foo;
  std::bitset<1> bar (1);
  std::bitset<1> baz (std::string("1"));

  std::cout << "foo: " << sizeof(foo) << '\n';
  std::cout << "bar: " << sizeof bar << '\n';
  std::cout << "baz: " << sizeof baz << '\n';

  return 0;
}
Run Code Online (Sandbox Code Playgroud)

  • 这实际上并没有回答这个问题. (4认同)