C 字符a[512]与字符b[512+;1]

C 字符a[512]与字符b[512+;1],c,arrays,performance,optimization,memory,C,Arrays,Performance,Optimization,Memory,我看到很多代码,使用以下符号 char a[512 + 1]; a[512] = '\0'; 它不是效率低下、内存利用率高吗?假设您使用的是32位机器。[512+1]实际上意味着[512+4]。 对于服务器应用程序来说,这可能不是什么大问题,但对于嵌入式系统编程来说,这很重要 此处没有使用额外内存。它是513字节,因为标准保证char在所有实现中都是1字节。填充字节是在结构而不是数组的情况下添加的。在数组的情况下,你得到的只是你想要的 请注意,该语法还有另外一个用途,它更具可读性 它清楚地

我看到很多代码,使用以下符号

char a[512 + 1];  
a[512] = '\0';
它不是效率低下、内存利用率高吗?假设您使用的是32位机器。[512+1]实际上意味着[512+4]。

对于服务器应用程序来说,这可能不是什么大问题,但对于嵌入式系统编程来说,这很重要

此处没有使用额外内存。它是
513
字节,因为标准保证
char
在所有实现中都是
1
字节。填充字节是在结构而不是数组的情况下添加的。在数组的情况下,你得到的只是你想要的

请注意,该语法还有另外一个用途,它更具可读性
它清楚地表明字符串应该是
512
char,并且需要额外的
char
来终止
\0
。责任更多的是在应用程序中编写可读性更强的代码

此处没有使用额外内存。它是
513
字节,因为标准保证
char
在所有实现中都是
1
字节。填充字节是在结构而不是数组的情况下添加的。在数组的情况下,你得到的只是你想要的

请注意,该语法还有另外一个用途,它更具可读性
它清楚地表明字符串应该是
512
char,并且需要额外的
char
来终止
\0
。责任更多的是在应用程序中编写可读性更强的代码

容纳
NULL
字符更安全

[512+1]实际上意味着[512+4]

512+1
将是
513
,除非您担心内存对齐问题

如果你仍然不开心,那就去做吧

 char arr[511+1];
 arr[sizeof(arr)-1]=0;

容纳
NULL
字符只是额外的安全性

[512+1]实际上意味着[512+4]

512+1
将是
513
,除非您担心内存对齐问题

如果你仍然不开心,那就去做吧

 char arr[511+1];
 arr[sizeof(arr)-1]=0;
在我看来是更好的


在我看来更好。

我不确定,但它应该取决于CPU的对齐限制。某些RISC CPU(如MIPS)不访问单个字节。使用load指令只能访问四字节字。在这种情况下,每个字节将占用一个字。我认为现实世界的情况并非如此。我怀疑编译器把连续的字符放在单词中。然后使用“屏蔽”检索单个字节


还没有否决投票:)非常“不自信”回答:)

我不确定,但这应该取决于CPU的对齐限制。某些RISC CPU(如MIPS)不访问单个字节。使用load指令只能访问四字节字。在这种情况下,每个字节将占用一个字。我认为现实世界的情况并非如此。我怀疑编译器把连续的字符放在单词中。然后使用“屏蔽”检索单个字节


现在还不要否决:)非常“不自信”的回答:)

将总对象大小设置为架构基本对齐的倍数确实是最节省内存的解决方案

另外,选择2的幂作为对象大小可能会避免分配对象的碎片,但这取决于libc分配器的实现


在主流体系结构中,您的特定示例很少成为问题,但有一个相关的问题:结构填充,另外要注意的是,编译器不能随意对成员重新排序。

将总对象大小设置为架构基本对齐的倍数确实是最节省内存的解决方案

另外,选择2的幂作为对象大小可能会避免分配对象的碎片,但这取决于libc分配器的实现


在主流体系结构上,您的特定示例很少是一个问题,但有一个相关的问题:结构填充,还有一个额外的警告,即编译器不能随意对成员重新排序。

首先,这个问题太宽,无法详细回答,因为它取决于所使用的CPU

但对于嵌入式系统编程来说,这很重要

每个半现代嵌入式MCU/MPU都可能支持错位访问,和/或支持比32位更小的加载指令。较小的8/16位现代MCU很可能根本没有任何对齐问题


如果您遇到无法读取未对齐数据的CPU,那么您能做什么。。。那么就没有办法分配奇数个字节。

首先,这个问题太宽,无法详细回答,因为它取决于所使用的CPU

但对于嵌入式系统编程来说,这很重要

每个半现代嵌入式MCU/MPU都可能支持错位访问,和/或支持比32位更小的加载指令。较小的8/16位现代MCU很可能根本没有任何对齐问题


如果您遇到无法读取未对齐数据的CPU,那么您能做什么。。。那么就无法分配奇数个字节。

这取决于比例。如果你有10个,谁在乎呢?如果你有一百万?那么你已经有512MB的数据了,所以我认为浪费掉的3MB不会是你真正的问题

必须分配100万个对象,因此分配控制结构将需要超过3MB的内存。优化分配更有意义,例如分配大型数组而不是单个对象。或者使用字节精确存储将字符串存储在一个大的字符数组中,因此长度为127的字符串将只使用128字节,而不是完整的513字节,这将浪费更多的时间。甚至以压缩格式存储每个字符串

如果需要完整的512字节,还可以存储