我正在努力提高代码效率。我有这样的事情:
typedef struct{
...
}MAP;
MAP* pPtr=NULL;
MAP* pTemp=NULL;
int iCount=0;
while (!boolean){
pTemp=(MAP*)realloc(pPtr,(iCount+1)*sizeof(MAP));
if (pTemp==NULL){
...
}
pPtr=pTemp;
...
iCount++;
}
正在动态分配内存。我想减少realloc调用,以使代码更有效。我想知道如果新大小等于旧大小,realloc将如何表现。这个电话会被忽略吗?
答案 0 :(得分:8)
未在标准C中指定。所有标准C保证:新对象的内容应与解除分配前旧对象的内容相同,直至新旧尺寸中的较小者。
但是,如果您使用的是GNU libc,它会明确地说明返回相同的地址,请参阅here了解详细信息。
如果您指定的新尺寸与旧尺寸相同,则
realloc
保证不会更改任何内容并返回您提供的相同地址。
答案 1 :(得分:3)
如果大小不改变,我不会指望realloc表现为无操作(尽管它似乎是合理的事情),但是你不必:如果iCount的值没有改变,不要调用realloc。
答案 2 :(得分:2)
C标准没有具体说明会发生什么,因此您将受到实施的支配。我无法想象任何不会返回传入指针的半实体实现,但安全选项是检查您自己的代码中的分配大小是否已更改。这也肯定会跳过函数调用。
(顺便说一下,请不要从realloc
转换返回值。没有必要,如果忘记#include <stdlib.h>
,它可能会隐藏未定义的行为。)