我正在编写一个需要在运行时创建数组的函数。该数组将非常小,因此我不担心不安全代码,但是我想编写“适当”的代码。因此,我考虑了三种替代方案:
- char array[len];
- char *array = new char[len];
- std::vector<char> array(len);
使用Compiler Explorer以 -O3 选项进行比较,得到如下结果:
- 12 条指令,0 次调用 new
- 21 条指令,1 次调用 new
- 118 条指令,2 次或更多次调用 new
我是否错过了针对 std::vector<> 的优化,还是“适当”的c++方式速度较慢,或者我完全忽略了一种编码方式?
编辑:我忘记删除堆分配的数组
测试代码:
code 1:
#include <string.h>
void populate_array(char* arr);
int compute_result(char* arr);
int str_to_arr(const char* str)
{
auto len = strlen(str);
char array[len];
populate_array(array);
return compute_result(array);
}
代码 2:
#include <string.h>
void populate_array(char* arr);
int compute_result(char* arr);
int str_to_arr(const char* str)
{
auto len = strlen(str);
char* array = new char[len];
populate_array(array);
auto result = compute_result(array);
delete[] array;
return result;
}
代码 3:
#include <string.h>
#include <vector>
void populate_array(std::vector<char> arr);
int compute_result(std::vector<char> arr);
int str_to_arr(const char* str)
{
auto len = strlen(str);
std::vector<char> array(len);
populate_array(array);
return compute_result(array);
}
unique_ptr
。 - HolyBlackCat来分配
len个字节的字符。在代码2中,由于您没有
delete[] array`,所以存在内存泄漏。 - Artyerboost::container::small_vector
是什么?基本上,选择一个len
的上限,然后你可以使用一个该大小的数组(不是VLA)。 - Marc Glisseg++ -std=c++20 ...
以及几乎所有警告,这对我来说很有效。 - Ebony Ayers