char a [512] vs char b [512 + 1]

时间:2012-04-11 10:26:20

标签: c arrays performance optimization memory

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

char a[512 + 1];  
a[512] = '\0';

这不是效率低下,内存利用率明智吗?假设您使用的是32位机器。并且[512 + 1]实际上意味着[512 + 4] 它对服务器应用程序来说可能不是什么大问题,但对于嵌入式系统编程来说,这一点很重要

7 个答案:

答案 0 :(得分:3)

char bla[512];
bla[sizeof bla - 1] = '\0';

在我看来更好。

答案 1 :(得分:1)

这里没有使用额外的内存。 513字节为char字节,1由所有实现的标准保证为512字节。如果结构不是数组,则添加填充字节。在阵列的情况下,你得到你没有要求的东西。

请注意,语法有另外的用途,它更强可读 它清楚地告诉字符串应该是char char,并且终止\0需要额外的{{1}}。更重要的是在应用程序中编写更易读的代码。

答案 2 :(得分:1)

使总体对象大小成为体系结构基本对齐的倍数,确实是最节省内存的解决方案。

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

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

答案 3 :(得分:1)

首先,问题太广泛了,无法详细解答,因为它取决于所使用的CPU。

  

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

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

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

答案 4 :(得分:0)

它可以提供额外的安全性来容纳NULL字符。

  

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

除非您担心内存对齐问题,否则

512+1将为513

如果你仍然不开心,那就

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

答案 5 :(得分:0)

我不确定,但它应该取决于CPU的对齐限制。某些RISC CPU(如MIPS)不访问单个字节。使用加载指令只能访问四个字节的字。在这种情况下,每个字节都会占用一个字。我不认为现实情况就是如此。我怀疑编译器将连续的'char'用于单词。然后使用'masking'来检索单个字节。

不要下来投票:)非常'不自信'答案:)

答案 6 :(得分:0)

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

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

如果你需要完整的512字节,你也可以存储没有终止'\ 0'的字符串,只能通过负责这个的包装函数来访问它们。

请注意,所有这些解决方案都意味着额外的工作可能容易出错,需要额外的照顾,比如最后一个。因此,请确保您需要大量可扩展性并且内存将成为瓶颈,否则您可能会对可读性和可维护性产生所有影响而进行过早优化,而不需要它。