相关疑难解决方法(0)

数组placement-new需要缓冲区中未指定的开销?

[expr.new]C++的5.3.4 2月草案给出了一个例子:

new(2,f) T[5]导致打电话operator new[](sizeof(T)*5+y,2,f).

这里,x和y是非负的未指定值,表示数组分配开销; new-expression的结果将从返回的值中抵消此数量operator new[].这种开销可以应用于所有数组新表达式,包括那些引用库函数operator new[](std::size_t, void*)和其他放置分配函数的表达式.开销的数量可能因新的一次调用而异.- 末端的例子 ]

现在来看以下示例代码:

void* buffer = malloc(sizeof(std::string) * 10);
std::string* p = ::new (buffer) std::string[10];
Run Code Online (Sandbox Code Playgroud)

根据上面的引用,第二行将new (buffer) std::string[10]在内部调用operator new[](sizeof(std::string) * 10 + y, buffer)(在构造单个std::string对象之前).问题是如果y > 0,预分配的缓冲区太小了!

那么我如何知道在使用数组放置时预先分配多少内存?

void* buffer = malloc(sizeof(std::string) * 10 + how_much_additional_space);
std::string* p = ::new (buffer) std::string[10];
Run Code Online (Sandbox Code Playgroud)

或者标准某处是否保证y == 0在这种情况下?报价再次说:

这种开销可以应用于所有数组新表达式,包括那些引用库函数operator …

c++ standards memory-management placement-new

62
推荐指数
4
解决办法
5787
查看次数

C API设计:谁应该分配?

在C API中分配内存的正确/首选方法是什么?

我首先看到两个选项:

1)让调用者完成所有(外部)内存处理:

myStruct *s = malloc(sizeof(s));
myStruct_init(s);

myStruct_foo(s);

myStruct_destroy(s);
free(s);
Run Code Online (Sandbox Code Playgroud)

_init_destroy功能是必需的,因为一些更多的内存可分配里面,而且必须在某个地方处理.

这样做的缺点是更长,但在某些情况下也可以消除malloc(例如,它可以传递给堆栈分配的结构:

int bar() {
    myStruct s;
    myStruct_init(&s);

    myStruct_foo(&s);

    myStruct_destroy(&s);
}
Run Code Online (Sandbox Code Playgroud)

此外,调用者必须知道结构的大小.

2)隐藏mallocs in _initfreein in _destroy.

优点:代码更短,因为无论如何都会调用函数.完全不透明的结构.

缺点:无法传递以不同方式分配的结构.

myStruct *s = myStruct_init();

myStruct_foo(s);

myStruct_destroy(foo);
Run Code Online (Sandbox Code Playgroud)

我目前正在倾向于第一个案例; 然后,我不知道C API设计.

c api malloc memory-management

52
推荐指数
4
解决办法
6852
查看次数

Pimpl成语不使用动态内存分配

我们想在项目的某些部分使用pimpl习语.项目的这些部分也恰好是禁止动态内存分配的部分,这个决定不在我们的控制范围内.

所以我要问的是,在没有动态内存分配的情况下,有没有一种干净又好的方法来实现pimpl习语?

编辑
以下是一些其他限制:嵌入式平台,标准C++ 98,没有外部库,没有模板.

c++ embedded pimpl-idiom dynamic-memory-allocation

28
推荐指数
2
解决办法
5554
查看次数

std :: align和std :: aligned_storage用于对齐的内存块分配

我试图分配的大小的存储器块size需要被Alignment对齐,其中尺寸可以在编译时定义.我知道例程,如_aligned_alloc,posix_memalign,_mm_alloc,等存在,但我不希望为他们带来降低代码的可移植性使用它们.
C++ 11给出了一个例行程序std::align,并且也是类std::aligned_storage从中我可以检索一个POD类型来分配将被对准以我的要求的元件.但是我的目标是创造条件,分配的内存块的分配size大小(不只是一个单一的元素),这将对齐.
这可能用std::align吗?我问的原因是std::align移动指针,使用该指针的类将给分配器一个指向移动的地址的指针,用于解除分配,这将是无效的.有没有办法以这种方式创建一个aligned_allocator?

c++ alignment allocator c++11

9
推荐指数
1
解决办法
5842
查看次数