对于我的计算,我只需要使用7位空间,所以我使用的是char类型。但是我想知道是否可以声明我自己的类型使用少于一个字节的内存?
答案 0 :(得分:12)
不是真的。在结构体内,您可以使用bit fields。因此,如果您知道您需要一定数量的固定条目,这将是一种保存几位的方法(但请注意,结构将始终填充到至少下一个整数字节)。另请注意,由于"正常" CPU不能寻址小于八位字节/字节的数量,对这些位字段值的访问可能会更慢,因为编译器必须生成额外的指令来获取/存储值#34;在中间" ;。因此,为了节省一些比特,你必须花费一些CPU时间。
C++11 standard章节 1.7 C ++内存模型(强调我的):
C ++内存模型中的基本存储单元是字节。 一个字节至少大到足以包含基本执行字符集(2.3)的任何成员和Unicode UTF-8编码格式的八位代码单元由连续的位序列组成,其数量是实现定义的。
换句话说:C ++中最小的可寻址单元至少为8位宽。
旁注:如果你想知道:there are machines like DSPs that can only address units larger than 8 bits at a time;对于这样的机器,编译器可以定义" byte"例如,16位宽。
答案 1 :(得分:6)
即使您尝试创建大小为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;
}
答案 2 :(得分:3)
byte是最小可寻址单元,并且C ++中的最小大小等于1.并且内存以字节为单位分配。即使是空类至少有不小于1个字节的大小。
答案 3 :(得分:2)
假设处理器不是一些与常规硬件完全不同的特殊硬件,那么使用7而不是8位不会获得任何收益,因为8位字节是最小可寻址单元(除了一些使用超过8位到一个字节的异国情调的机器,在我30多年的使用计算机的过程中,除了我的一位朋友在夏季实习期间工作的霍尼韦尔大型机外,我没有使用过一台机器,我被邀请了访问一天 - 我不知道它是什么型号,所以它可能是一台18或36位的机器 - 大约在1985年左右。)
因此,假设你可以制作一个7字节&#34;大块&#34;的大数组,编译器必须生成额外的代码来从数组中提取每个7字节的元素,所以不要采用一条指令为了获取一个8位字节,所有访问将至少进行两次操作,并且一些将跨越两个机器字,需要另外两个操作来从两个机器字中提取7位的相关组合。这是可能的,但是通过使用8位字,它很可能浪费超过1/8的空间。换句话说,即使你可以这样做,也会有性能下降而不是获得。
如果有一个512位字机器可能是合理的,因为你可以将73个7位字组合成一个512位字。但是512位字机并不常见,甚至在x86-64处理器上设置的AVX512指令也不是真正的512字节字,你不能(很容易)每隔7位访问一次位域,你必须一次将8,16,32,64等块混合在一起。
答案 4 :(得分:-1)
sizeof
为小于一个字节的对象提供什么? 0到1之间的整数值?
sizeof
在 bytes 中给出其操作数的大小,并且0显然不是可能的结果,因为返回类型使得1成为可能的最小值sizeof
是一个整数类型。因此,没有对象可以具有小于一个字节的存储器表示。