在C中,等效的C ++放置是否会退出?我的意思是,一个对象可以在C中的指定位置构建吗?可以realloc()
使用吗?
答案 0 :(得分:10)
Placement new只是跳过分配并在预分配的内存中构造一个对象。由于C缺少构造函数,因此不需要新的位置。我认为等价物是一个指针类型转换,因为一旦你有一个指针,就可以表现为一个对象存在。
从公共内存池中雕刻不同类型的对象的示例:
char *pool = (char *) malloc( 1000 );
char *pen = pool;
foo *obj1 = (foo *) pen;
pen += sizeof (foo);
bar *obj2 = (bar *) pen;
pen += sizeof (bar);
/* etc */
当然,在执行此操作时,您需要负责将正确的指针传递给free
,并考虑对齐要求 - 就像在C ++中放置新内容一样。
答案 1 :(得分:3)
由于C没有像构造函数那样的东西,你可以简单地获取地址并将其转换为指向你想要使用的类型的指针。当然,您需要确保正确对齐,否则可能会失败(但在C ++中使用new替换也是如此)。
答案 2 :(得分:1)
C中没有“placement new”这样的东西。另一方面,你可以声明一个指针并指向内存中的任何东西:
char *pointer = 0x12345678;
上面的指针现在指向地址0x12345678
。
这通常用于嵌入式系统,其中某些设备位于内存中的某些位置。