gpt4 book ai didi

c++ - 为什么使用最大位域序列定义 C++ 内存?

转载 作者:搜寻专家 更新时间:2023-10-31 00:55:03 25 4
gpt4 key购买 nike

最小的存储单位是字节,见quotes from standard here :

The fundamental storage unit in the C++ memory model is the byte.

但是随后内存位置被定义为可能是相邻的位域:

A memory location is either an object of scalar type or a maximal sequence of adjacent bit-fields all having nonzero width.

我想理解这个定义:

  • 如果最小的存储单元是字节,为什么我们不将内存位置定义为字节序列?
  • C 风格的位域如何与第一句话相匹配?
  • 什么是最大序列;这里最大的是什么?
  • 如果我们在内存定义中有位域,为什么我们还需要其他东西?例如。 float 或 int 都是由位组成的,因此“要么是标量类型的对象”-部分似乎多余。

最佳答案

让我们来分析一下术语:

供引用:

http://en.cppreference.com/w/cpp/language/bit_field http://en.cppreference.com/w/cpp/language/memory_model

字节

如您所说,内存中(通常)8 位的最小单元,可使用内存地址显式寻址。

位域

BITS 序列,带有显式位计数!

内存位置

字节多类型的每个地址或 (!!!) 非零大小的连续位字段序列的开头。

您的问题##

让我们以 cpp-reference 示例为例,再进行一些评论,并一一回答您的问题:

struct S {
char a; // memory location #1, 8-bit character, no sequence, see missing :#, scalar-type.
int b : 5; // memory location #2, new sequence, new location, integer-type of 5-bits length
int c : 11, // memory location #2 (continued) integer-type of 11-bits length
: 0, // (continued but ending!) IMPORTANT: zero-size-bitfield, sequence ends here!!!
d : 8; // memory location #3 integer-type 8-bit, starts a new bit-field sequence, thus, new memory-location
struct {
int ee : 8; // memory location #4
} e;
} obj; // The object 'obj' consists of 4 separate memory locations
  • 如果最小的存储单元是字节,为什么我们不将内存位置定义为字节序列?

也许我们想要对给定系统类型的内存消耗进行细粒度的位级控制,即 7 位整数或 4 位字符,......一个字节作为单位的 chalice 会剥夺我们的自由

  • C 风格的位域如何与第一句话相匹配?

实际上,由于位域特性起源于 C...这里重要的是,即使你用位域定义一个结构,例如只消耗 11 位,第一位将在内存中字节对齐,即有一个位置对齐到 8 位步长和数据类型最终将至少消耗(!)16位,以保存位域......存储数据的确切方式至少在 C 中不是标准化的 afaik。

  • 最大序列的点是什么;这里最大的是什么?

最大序列的要点是允许各个字段的有效内存对齐,编译器优化,......在这种情况下最大意味着所有位域在大小序列中声明> = 1,即没有其他标量类型和没有带有“:0”的位域

  • 如果我们在内存定义中有位域,为什么我们还需要其他东西?例如。 float 或 int 都是由位组成的,因此“要么是标量类型的对象”部分似乎是多余的。

不,两者都是由位组成的,但是:不指定类型的位大小,将使编译器采用默认大小,即 int:32 位...如果您不需要整数值的分辨率如此之高,但例如只有 24 位,您可以编写 unsigned int v : 24, ...

当然,非位域的写法也可以用位域来表示,例如:

int a,
int b : 32 // should be equal to a

但是(我不知道,这里有船长吗?)

如果系统定义的类型 T 的默认值是 n 位,并且您编写如下内容:

T value : m // m > n

我不知道结果是什么......

关于c++ - 为什么使用最大位域序列定义 C++ 内存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43224515/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com