相关疑难解决方法(0)

279
推荐指数
8
解决办法
19万
查看次数

malloc如何理解对齐?

以下摘录自此处

pw = (widget *)malloc(sizeof(widget));
Run Code Online (Sandbox Code Playgroud)

分配原始存储.实际上,malloc调用分配的存储空间足够大并且适当地对齐以容纳类型为widget 的对象

他还说,从草本植物中看到快速的pImpl,他说:

对齐.任何内存对齐.保证通过new或malloc动态分配的任何内存都可以正确地对齐任何类型的对象,但是没有动态分配的缓冲区没有这样的保证

我对此感到好奇,malloc如何知道自定义类型的对齐方式?

c c++ memory-alignment

47
推荐指数
3
解决办法
2万
查看次数

malloc&placement new vs. new

过去几天我一直在研究这个问题,到目前为止,除了教条论点或对传统的诉求之外,我还没有真正找到任何令人信服的东西(即"它是C++方式!").

如果我正在创建一个对象数组,使用时有什么令人信服的理由(除了易用性):

#define MY_ARRAY_SIZE 10

//  ...

my_object * my_array=new my_object [MY_ARRAY_SIZE];

for (int i=0;i<MY_ARRAY_SIZE;++i) my_array[i]=my_object(i);
Run Code Online (Sandbox Code Playgroud)

过度

#define MEMORY_ERROR -1
#define MY_ARRAY_SIZE 10

//  ...

my_object * my_array=(my_object *)malloc(sizeof(my_object)*MY_ARRAY_SIZE);
if (my_object==NULL) throw MEMORY_ERROR;

for (int i=0;i<MY_ARRAY_SIZE;++i) new (my_array+i) my_object (i);
Run Code Online (Sandbox Code Playgroud)

据我所知,后者比前者更有效(因为你没有不必要地将内存初始化为一些非随机值/调用默认构造函数),唯一的区别就在于你清理了一个:

delete [] my_array;
Run Code Online (Sandbox Code Playgroud)

另一个你清理:

for (int i=0;i<MY_ARRAY_SIZE;++i) my_array[i].~T();

free(my_array);
Run Code Online (Sandbox Code Playgroud)

我出于一个令人信服的理由.上诉的事实,这是C++(不是C),因此mallocfree不应使用不-据我可以告诉- 引人注目的一样,因为它是教条主义.是否有一些我缺少的东西new []优于malloc

我的意思是,就我所知,你根本不能使用new []- 根本没有 - 创建一个没有默认的无参数构造函数的数组,而这个malloc方法可以这样使用.

c++ malloc placement-new new-operator

37
推荐指数
6
解决办法
5973
查看次数

:: operator new(size_t)是否使用malloc()?

是在内部::operator new(size_t)调用malloc(),还是直接使用系统调用/特定于操作系统的库调用?C++标准说什么?

这个答案中它说:

malloc()保证返回与任何标准类型对齐的地址.::operator new(n)只保证返回一个不大于任何标准类型的地址n,如果T不是一个字符类型,那么new T[n]只需要返回一个对齐的地址T.

这表明new()不需要打电话malloc().

注意:这里有一个SO 问题有关的一切operator new其他比分配.

c++ malloc new-operator dynamic-memory-allocation

12
推荐指数
2
解决办法
3626
查看次数

C++内存对齐是正确还是低效?

我测试了这段代码,试图找出为新运算符实际保留了多少内存c ++.

#include<iostream>
using namespace std;
int main() {

  cout << "alignment of " << alignof(int) << endl;
  int *intP1 = new int;
  *intP1 = 100;
  cout << "address of intP1 " << intP1 << endl;
  int *intP2 = new int;
  *intP2 = 999;
  cout << "address of intP2 " << intP2 << endl;
  int *intP3 = new int;
  cout << "address of intP3 " << intP3 << endl;
  *intP3 = 333;

  cout << endl;
  cout << (reinterpret_cast<char *>(intP3)-reinterpret_cast<char *>(intP2)) …
Run Code Online (Sandbox Code Playgroud)

c++ memory alignment

6
推荐指数
1
解决办法
1080
查看次数