C11标准的3.6节将“字节”定义为“数据存储的可寻址单位...以保存...字符”。
C ++ 11标准的1.7节将“字节”定义为“ C ++内存模型中的基本存储单元,以包含...字符”。
两个定义都没有说“字节”是最小可寻址单元。这是因为标准有意要从特定计算机中抽象吗?您能否提供一个真实的机器示例,其中C / C ++编译器被确定为“字节”长于或短于最小可寻址单元?
答案 0 :(得分:7)
在严格符合C代码的情况下,字节是最小的可寻址单元。与C实现在其上执行程序的机器是否支持寻址较小的单元无关。 C实现必须呈现一个视图,其中字节是严格符合C代码的最小可寻址单元。
C实现可以支持将较小的单元作为扩展寻址,例如仅通过定义某些指针操作的结果即可,而这些操作本来不是C标准所定义的。
答案 1 :(得分:2)
8051系列是其中最小可寻址单元小于一个字节的真实计算机及其编译器的一个示例。我习惯的一种编译器是Keil C51。
最小可寻址单元是一点。您可以定义此类型的变量,可以对其进行读写。但是,定义变量的语法是非标准的。当然,C51需要几个扩展来支持所有这些。顺便说一句, 不允许指向位的指针。
例如:
unsigned char bdata bitsAdressable;
sbit bitAddressed = bitsAdressable^5;
void f(void) {
bitAddressed = 1;
}
bit singleBit;
void g(bit value) {
singleBit = value;
}
答案 2 :(得分:1)
两个定义都没有说“字节”是最小可寻址单位。
那是因为他们不需要。按字节类型(char
,unsigned char
,std::byte
等)具有足够的限制来强制执行此要求。
字节类型的大小为explicitly defined to be precisely 1:
sizeof(char),sizeof(有符号字符)和sizeof(无符号字符)均为1。
字节类型is the smallest alignment possible的对齐方式:
此外,窄字符类型(6.9.1)应具有最弱的对齐要求
这当然不必是1的对齐方式。除了...确实如此。
请参见,如果对齐方式大于1,则意味着简单的字节数组将不起作用。数组索引基于指针算术,并且指针算术根据sizeof(T)
确定下一个地址。但是,如果alignof(T)
大于sizeof(T)
,则T
的任何数组中的第二个元素都将未对齐。那是不允许的。
因此,即使标准没有明确指出字节类型的对齐方式为1,其他要求也必须确保字节对齐。
总体而言,这意味着指向对象的每个指针的对齐方式至少与按字节类型的对齐方式一样严格。因此,相对于按字节类型的对齐,没有对象指针可以对齐。因此,所有有效的非NULL指针(指向活动对象或末尾指针的指针)必须至少足够对齐以指向char
。
类似地,两个指针之间的差异为defined in C++,因为这些指针所指向的元素的数组索引之间的差异(C ++中的指针算法要求两个指针指向同一数组)。如前所述,加法指针算法基于所指向的类型sizeof
。
鉴于所有这些事实,即使实现的指针地址可以小于char
的地址,C ++抽象模型在功能上不可能生成指针,并且使该指针计数为有效(指向对象/函数,数组的末尾或为NULL)。您可以使用从整数强制转换来创建这样的指针值。但是您将创建一个无效的指针值。
因此,从技术上讲,机器上的地址可能较小,但您永远无法在有效的,格式正确的C ++程序中实际使用它们。
显然,编译器扩展可以执行任何操作。但是就符合标准的程序而言,根本不可能生成针对字节类型未对齐的有效指针。
答案 3 :(得分:1)
我在1990年代初期对TMS34010及其后续的TMS34020图形芯片进行了编程,它们具有平坦的地址空间,并且可以按 bit 位寻址,即每个位索引的地址。对于内存更珍贵的那段时间和过去,这对于计算机图形学非常有用。
embedded C-compiler并没有真正直接访问各个位的能力,因为从(标准)C语言的角度来看,该字节仍然是上一篇文章中指出的最小单位。
因此,如果要读取/写入C语言中的位流,则需要一次(至少)一次读取/写入一个字节和缓冲区(例如,编写算术或霍夫曼编码器时)。
答案 4 :(得分:1)
(谢谢所有评论和回答的人,每个单词都可以帮助您)
编程语言的内存模型和目标计算机的内存模型是不同的。
是的,在编程语言的内存模型中,字节是最小可寻址单元。
否,字节不是机器内存模型中的最小可寻址单元。例如,有些机器的最小可寻址单元长于或短于编程语言的“字节”: