我看到很多代码,使用以下符号
char a[512 + 1];
a[512] = '\0';
它不是效率低下,内存利用明智吗?假设您使用的是 32 位机器。而 [512 + 1] 实际上意味着 [512 + 4]。
对于服务器应用程序来说,这可能没什么大不了的,但对于嵌入式系统编程来说,这很重要。
我看到很多代码,使用以下符号
char a[512 + 1];
a[512] = '\0';
它不是效率低下,内存利用明智吗?假设您使用的是 32 位机器。而 [512 + 1] 实际上意味着 [512 + 4]。
对于服务器应用程序来说,这可能没什么大不了的,但对于嵌入式系统编程来说,这很重要。
char bla[512];
bla[sizeof bla - 1] = '\0';
在我看来更好。
使总对象大小成为架构基本对齐的倍数确实是最节省内存的解决方案。
此外,选择 2 的幂作为对象大小可能会避免分配对象的碎片,但这取决于 libc 分配器的实现。
在主流架构上,您的特定示例很少成为问题,但有一个相关的问题:结构填充,另外需要注意的是编译器不能随意重新排序成员。
首先,这个问题太宽泛,无法详细回答,因为这取决于所使用的 CPU。
但对于嵌入式系统编程来说,这很重要。
每个半现代的嵌入式 MCU/MPU 都可能支持未对齐的访问,和/或支持比 32 位更小的加载指令。较小的 8/16 位现代 MCU 很可能根本没有任何对齐问题。
如果您确实遇到无法读取未对齐数据的 CPU,那么您能做什么……那么您无法分配奇数个字节。
这里没有使用额外的内存。它是513
字节,char
标准保证1
在所有实现中都是字节。如果是结构而不是数组,则添加填充字节。如果是数组,您将得到您所要求的。
请注意,语法有一个额外的目的,它更具可读性。
它清楚地表明该字符串应该是512
char 并且需要额外char
的 terminating \0
。责任更多的是在应用程序中编写更具可读性的代码。
这取决于规模。如果你有10个,谁在乎?如果你有一百万?那么你已经有 512MB 的数据,所以我认为浪费的 3MB 不会是你真正的问题。
必须分配 100 万个对象,因此分配控制结构将需要超过 3MB 的空间。优化分配更有意义,例如分配大型数组而不是单个对象。或者将字节精确存储的字符串存储在一个大型 char 数组中,因此长度为 127 的字符串将仅使用 128 个字节,而不是完整的 513 个字节,浪费更多。甚至以压缩格式存储每个字符串。
如果您需要完整的 512 字节,您也可以存储没有终止 '\0' 的字符串,并且只能通过处理此问题的包装函数访问它们。
请注意,所有这些解决方案都意味着额外的工作,可能容易出错并且需要格外小心,就像最后一个一样。因此,请确保您需要对大量数据的可扩展性,并且内存将成为瓶颈,否则您可能会在不需要它的情况下进行过早的优化,从而对可读性和可维护性产生所有影响。
它只是额外的安全来容纳NULL
角色。
而 [512 + 1] 实际上意味着 [512 + 4]。
512+1
除非你担心513
内存对齐问题?
如果你仍然不开心,那就去吧
char arr[511+1];
arr[sizeof(arr)-1]=0;
我不确定,但这应该取决于您的 CPU 的对齐限制。某些 RISC CPU(如 MIPS)不访问单个字节。使用加载指令只能访问四个字节的字。在这种情况下,每个字节都会占用一个字。我认为在现实世界中情况并非如此。我怀疑编译器将连续的'char'放在单词中。然后使用“掩码”来检索单个字节。
不要拒绝投票:)非常“不自信”的答案:)