C++ 多维数组-malloc vs new

C++ 多维数组-malloc vs new,c++,c,arduino,malloc,avr-gcc,C++,C,Arduino,Malloc,Avr Gcc,我想分配2D阵列,我正在考虑两种可能性(Arduio上的avr gcc): A: int**arr=newint*[5]; 对于(int i=0;i Malc .< /P> < P> C,你不能通过代码< 代码>分配内存,因为没有这样的东西。对于C++,您可能喜欢新< /C> >,由于以下两个原因: 异常(除非您明确添加(std::nothrow)) 初始值设定项列表(从C++11开始) 安全性更好,因为它返回正确类型的指针(特别不是void*) 更清晰的语法(但这纯粹是主观的) 有关该

我想分配2D阵列,我正在考虑两种可能性(Arduio上的avr gcc):

A:

int**arr=newint*[5];
对于(int i=0;i<5;i++){
arr[i]=新整数[10];
}
B:

int**arr=malloc(5*sizeof(int*);
对于(int i=0;i<5;i++){
arr[i]=malloc(10*sizeof(int))
} 

A和B之间有什么区别吗?编译器是否会在这两种情况下创建相同的字节码(arv gcc)?

A和B基本上是等效的

编译器可能会也可能不会创建相同的代码(顺便说一句,不是字节码)。但是通常使用
new
操作符可以简单地归结为调用
malloc
。要找到答案,请使用
gcc-S
编译程序,并查看程序集输出


<>但是对于C++程序,你应该更喜欢<代码>新< /COD> > <代码> Malc .< /P> < P> C,你不能通过代码< <新>代码>分配内存,因为没有这样的东西。对于C++,您可能喜欢<代码>新< /C> >,由于以下两个原因:
  • 异常(除非您明确添加
    (std::nothrow)
  • 初始值设定项列表(从C++11开始)
  • 安全性更好,因为它返回正确类型的指针(特别不是
    void*
  • 更清晰的语法(但这纯粹是主观的)
有关该问题的更多讨论,请参阅

如果要分配一个二维数组,并且在编译时知道最右边的大小(即它是一个常量表达式-
constexpr
),则不需要循环

C++中的新 如果希望它预先设置为零(即,像
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 这将分配数组,就像
arr[5][10]
(仅在索引意义上)

要在这两种情况下访问其元素,只需使用:

arr[a][b]
要释放它,您基本上需要:

free(arr);
<> P> C++ C++中,你还需要注意Casic,并可能对它进行编码:<代码> STD< /C> >,所以它是<代码> STD::MalOC/(特别是如果包含<代码> CSTDLIB < /C> >,作为<代码> STDLIB .H./Cuth.Culter在C++标准中被弃用):

const int N=10;
整数(*arr)[N]=
静态(标准:malloc(5*sizeof(*arr));

<>但是我不认为你会喜欢它。

< P>如果你使用C++编译器(和ARDIIO草图是C++),你可能更喜欢<代码>新< /C>。做一个简单的
int
数组不太重要,但我会把C遗留的东西留给必须在C环境中运行的代码


现在绝对没有理由让C+程序员(一种从未全心全意地从C转换到C++的奇怪程序员)存在:-)

C编译器不会生成字节码(我希望如此),而是会生成汇编代码,最终生成二进制代码。你是想用C#或Java来标记你的问题吗?你在编译时知道一个或两个维度吗?你可以在gcc.godbolt.org上看到自己的机器代码。如果你发布的代码与你实际使用的代码非常相似,你应该只使用静态数组。当编译时已知维度时,不需要<代码>新< /代码>。在编译时,在C++中,维度是未知的。您需要将Malc转换为MULLC,不幸的是,这个示例将指针分配给2D数组。由于分配的所有内存都在一起,因此这可能比OP的指针指向指针的示例执行得更好。如果你需要指向指针的指针,你可以构造指向2D数组的指针数组。。。也许您可以发布一篇后续文章,解释为什么
inline
不应该优先于扩展到其他宏的宏expression@EliasVanOotegem如果没有达到你的期望,你可以自由地留下评论(在这里,而不是在这里)。添加了一些我在过去偶然发现的宏类型的示例
delete[] arr;
int (*arr)[10] = malloc(5 * sizeof(*arr));
arr[a][b]
free(arr);
const int N = 10;

int (*arr)[N] =
    static_cast<int (*)[N]>(std::malloc(5 * sizeof(*arr)));