在C/C++中填充字符数组[已关闭]

zmeyuzjn  于 12个月前  发布在  C/C++
关注(0)|答案(3)|浏览(85)

已关闭,此问题需要details or clarity。目前不接受答复。
**想改善这个问题吗?**通过editing this post添加详细信息并澄清问题。

11天前关闭
Improve this question
互联网上的多个来源,包括Stackoverflow上的this question,表明在C中数组的元素之间永远不会有任何填充。
但是,根据2nd Edition of Compilers: Principles, Techniques, and Tools,第428页(逻辑)或453页(物理):
在许多机器上,整数相加的指令可能期望整数对齐,即放置在可被4整除的地址处。虽然长度为10的字符数组(如C中)只需要足够的字节来容纳10个字符,但编译器可能会分配12个字节来获得正确的对齐,留下2个字节未使用。
为了验证这一点,我写了一个小的C++程序来打印char数组元素的地址,并且没有填充。

hsgswve4

hsgswve41#

虽然长度为10的字符数组(如C中)只需要足够的字节来容纳10个字符,但编译器可能会分配12个字节来获得正确的对齐,留下2个字节未使用。
这是一种误导性的说法。如果在文件范围内声明

int before;
char my_array[10];
int after;

那么数组的大小是10。编译器可能会在my_array的存储之前或之后留下未分配的空间,但这是由编译器决定的,并且这样的额外空间不是数组的一部分(在这种情况下,我通常不称之为“填充”,而是YMMV)。
如果声明一个包含数组的结构:

struct my_struct {
    int before;
    char my_array[10];
    int after;
}

那么编译器可以用my_arrayafter之间的填充来布局结构,但是数组的大小仍然是10。填充属于结构,而不是数组。
对于元素类型本身具有大于1字节的对齐要求的数组也是如此。数组的开始可以被分配,使得之前存在未使用的空间,但是该空间不是数组的一部分。
为了验证这一点,我写了一个小的C程序来打印char数组元素的地址,并且没有填充。
在同一个数组的元素之间肯定没有填充。C和C
在这一点上都很清楚,你引用的源代码也没有说。

jckbn6z7

jckbn6z72#

你所指的问题与结构填充有关,而不是C或C++中数组元素之间的填充。在此上下文中,填充是指在结构成员之间插入未使用的字节,以便在内存中正确对齐它们。
在数组的情况下,元素连续存储在内存中,它们之间没有任何填充。每个元素都占用其数据类型所需的确切空间量。
你提到的这段话来自《* 编译器:原理、技术和工具 *”讨论的是结构填充,它与数组没有直接关系。在处理结构时,编译器可能会在成员之间插入填充字节,以根据目标计算机体系结构的对齐要求对齐它们。这种对齐可以提高性能,因为一些处理器可能对某些数据类型有对齐限制。

pkmbmrz7

pkmbmrz73#

你引用的文本讨论了(a)某些整数类型所需的对齐和(b)字符数组后的填充。这里提到的两种不同的类型表明,填充不是针对字符数组,而是针对某个整数类型。这一点的线索在你引用之前的段落中,它结束了:
聚集􏰐门类型(􏰏如数组或结构)􏰏的存储空间必须足够大,以容纳其所有组件􏰑。
因此,引用可以一般地讨论聚合中的填充。字符数组本身不需要任何填充,但如果它在一个也具有整数类型的结构中,则在字符数组之后可能需要填充,以便结构的下一个成员具有所需的对齐方式(或者整个结构具有所需的大小,以使其大小是其成员对齐要求的倍数)。引用也可以讨论放置多个对象,如在排列编译器将放置在堆栈空间或其他存储中的几个对象时。

相关问题