多维数组——malloc vs new
Multidimensional Arrays - malloc vs new
我想分配2D数组,我正在考虑两种可能性(Arduio上的avr-gcc):
:
int **arr = new int*[5];
for(int i = 0 ; i < 5 ; i++){
arr[i] = new int[10];
}
B:
int **arr = malloc(5 * sizeof(int *));
for(int i = 0 ; i < 5 ; i++) {
arr [i] = malloc(10* sizeof(int))
}
A和B有什么不同吗?编译器会在这两种情况下(arv-gcc)创建相同的字节码吗?
在C中,您不能通过new
分配内存,因为没有这样的事情。对于c++,您可能更喜欢new
,原因如下:
- 例外(除非明确添加
(std::nothrow)
) - 初始化列表(c++ 11起)
- 更好的安全性,因为它返回正确类型的指针(特别是不是
void *
) - 更干净的语法(但这纯粹是主观的)
参见在什么情况下使用malloc和/或new?关于那件事的更多讨论。
如果你想分配一个二维数组,并且最右边的大小在编译时是已知的(即它是一个常量表达式- constexpr
),那么你不需要循环。
c++新特性
int (*arr)[10] = new int [2][10];
如果您希望它预先设置为零(即,像std::calloc
),则使用:
int (*arr)[10] = new int [2][10]{0}; // C++11
int (*arr)[10] = new int [2][10](); // C++03
就像任何由new[]
分配的数组一样,有一个相应的delete[]
操作符来释放它:
delete[] arr;
C和c++中的Malloc
int (*arr)[10] = malloc(5 * sizeof(*arr));
分配数组,类似于arr[5][10]
(仅在索引意义上)。
要访问这两个元素,只需使用:
arr[a][b]
要释放它,基本上可以这样做:
free(arr);
在c++中,你还需要注意转换,并可能用std
来限定它,所以它是std::malloc
(特别是如果包括cstdlib
,因为stdlib.h
头在c++标准中已被弃用):
const int N = 10;
int (*arr)[N] =
static_cast<int (*)[N]>(std::malloc(5 * sizeof(*arr)));
但是我认为你不会喜欢它。
如果您正在使用c++编译器(和Arduino草图是 c++),你应该更喜欢new
。做一个简单的int
数组不太可能有什么关系,但我只会为具有的代码在C环境中运行留下C遗留的东西。
现在c++程序员(那些从不全心全意从C过渡到c++的奇怪程序员)绝对没有理由存在:-)
A和B基本上是等价的。
编译器可以创建也可以不创建相同的代码(顺便说一句,不是字节码)。但通常使用new
操作符只是简单地归结为对malloc
的调用。要找出答案,请使用gcc -S
编译程序并查看程序集输出。
但是对于c++程序,你应该选择new
而不是malloc
。
- 在VS代码中交叉编译Windows与Linux上的MinGW的SDL程序
- 如何为模板化对象创建模板向量?VS正在投掷C3203
- 数据成员SFINAE的C++17测试:gcc vs clang
- 为什么在Windows上的VS 2019和Clang 9中"size_t"在没有标题的情况下工作
- 在for循环中使用auto vs decltype(vec.size())来处理字符串的向量
- char array[sizeof(Message)]; vs char* array = new char[sizeo
- Malloc vs New for Primitives
- C++ VS:多 DLL 解决方案中的'new'和'delete'覆盖
- Calloc vs new 用于各种编译器中的复杂结构
- C++ std::vector<> vs new[] 性能
- CDialog *m_pages[6]; vs CDialog *m_pages = new CDialog[6];?
- void* in malloc vs operator new
- std::shared_ptr 初始化:make_shared<Foo>() vs shared_ptr<T>(new Foo)
- new int[size] vs std::vector
- LocalAlloc Vs GlobalAlloc Vs malloc Vs new
- new vs *new in C++
- 类重载new和delete vs放置new与定制的内存类
- new vs. new (featuring malloc!)
- 多维数组——malloc vs new
- 使用unique_ptr显式delete和new vs