我想知道当使用较小(非零)大小调用realloc时,C或C++标准是否保证指针不会更改:
size_t n=1000;
T*ptr=(T*)malloc(n*sizeof(T));
//<--do something useful (that won't touch/reallocate ptr of course)
size_t n2=100;//or any value in [1,n-1]
T*ptr2=(T*)realloc(ptr,n2*sizeof(T));
//<-- are we guaranteed that ptr2==ptr ?
Run Code Online (Sandbox Code Playgroud)
基本上,操作系统可以自行决定,因为我们释放了大量内存块,他想利用所有realloc来对内存进行碎片整理,并以某种方式移动ptr2?
在之前的一个问题中,我询问了类型转换指针,但是针对使用C++分配系统而不是mallocs的更好解决方案.(我正在将一些C代码转换为C++)
但是,我仍然遇到类似功能的问题:
我变了:
tmp = malloc(sizeof(char*) * mtmp); --> tmp = new char*[mtmp];
Run Code Online (Sandbox Code Playgroud)
和
free(tmp) --> delete [] tmp;
Run Code Online (Sandbox Code Playgroud)
但是,我在以下函数中如何处理realloc:
char* space_getRndPlanet (void)
{
int i,j;
char **tmp;
int ntmp;
int mtmp;
char *res;
ntmp = 0;
mtmp = CHUNK_SIZE;
//tmp = malloc(sizeof(char*) * mtmp); <-- replaced with line below
tmp = new char*[mtmp];
for (i=0; i<systems_nstack; i++)
for (j=0; j<systems_stack[i].nplanets; j++) {
if(systems_stack[i].planets[j]->real == ASSET_REAL) {
ntmp++;
if (ntmp > mtmp) { /* need more space */
mtmp += …Run Code Online (Sandbox Code Playgroud) 每个人都知道:
realloc 调整现有内存块的大小或将其复制到更大的块.calloc 确保内存归零并防止算术溢出,并且通常面向大型阵列.为什么C标准没有提供如下结合上述两者的功能?
void *recalloc(void *ptr, size_t num, size_t size);
Run Code Online (Sandbox Code Playgroud)
调整大型哈希表或自定义内存池的大小不是很有用吗?
在阅读/sf/answers/223334261/时,我有一个问题.Qt作者在Qt 4容器内部所说的内容:
... QVector使用realloc()以4096字节的增量增长.这是有道理的,因为现代操作系统在重新分配缓冲区时不会复制整个数据; 物理内存页面只需重新排序,只需要复制第一页和最后一页上的数据.
我的问题是:
1)现代操作系统(Linux - 对我来说最有趣; FreeBSD,OSX,Windows)及其realloc实现是否真的能够使用虚拟到物理映射的重新排序重新分配数据页面并且无需逐字节复制?
2)用于实现此内存移动的系统调用是什么?(我认为可以splice使用SPLICE_F_MOVE,但它现在有缺陷且没有操作(?))
3)它是有利可图使用这些页面重排,而不是逐字节复制,尤其是在多核多线程的世界里,虚拟到物理映射的每一个变化需要刷新(无效)改变从页表项TLB中的所有特殊数十个CPU核心与IPI?(在linux中,这就像是flush_tlb_range或者flush_tlb_page)
upd for q3:mremap vs memcpy的一些测试
考虑以下(C11)代码:
void *ptr = aligned_alloc(4096, 4096);
... // do something with 'ptr'
ptr = realloc(ptr, 6000);
Run Code Online (Sandbox Code Playgroud)
由于ptr指向的内存具有4096字节的对齐aligned_alloc,是否(读取:是否保证)在(成功)调用之后保持该对齐realloc?或者内存可以恢复为默认对齐?
如何将malloc放在另一个结构体内?
我还想在结构中malloc一个项目数组,然后在需要时重新分配这个数组,这是如何正确完成的?
你能举个例子来说明一个结构,然后是上面的结构.
我有点不确定事情的顺序.
结构中的数组是否会被释放,然后结构本身,结构在创建时是否必须被malloced,然后它的字段被malloced /声明等?
在为嵌入式系统开发软件时,我realloc()多次使用了函数.现在我被告知我"不应该realloc()在嵌入式中使用"而没有任何解释.
realloc()嵌入式系统是危险的,为什么?
我有一个内存接口,分离出获取地址空间与附加后备存储.(在Linux下,接口管理的地址空间池是mmap'ed MAP_ANONYMOUS和MAP_NORESERVE,madvise'ed MADV_DONTNEED和mprotect'ed PROT_NONE.然后通过madvise MADV_WILLNEED和mprotect PROT_READ,PROT_WRITE和PROT_EXEC附加支持.)
这个界面允许我分配大量的地址空间,同时懒洋洋地获取实际的物理内存.我想用它来创建一个"懒惰的向量",它在适当的点上提出后备存储请求,但是当它增长时从不复制向量的当前内容.
鉴于标准库的分配器的语义是这样的方案可能吗?感激地接受指针,提示或其他指导.