C++ 多维数组-malloc vs new
我想分配2D阵列,我正在考虑两种可能性(Arduio上的avr gcc): A: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*) 更清晰的语法(但这纯粹是主观的) 有关该
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/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)));