【发布时间】:2021-01-10 11:26:12
【问题描述】:
我正在编写一个需要在运行时创建数组的函数。该数组将很小,因此我不担心不安全的代码,但是,我想编写“正确”的代码。因此,我正在考虑三种选择:
- 字符数组[len];
- char 数组 = new char(len);
- std::vector array(len);
使用Compiler Explorer 将它们与-O3 进行比较。 结果是这样的:
- 12 条指令,0 次调用 new
- 21 条指令,1 次调用 new
- 118 条指令,2 次以上 new 调用
我是否缺少对 std::vector 的优化,或者“正确”的 c++ 方式是否较慢,或者我完全错过了一种编码方式?
编辑:我忘了删除堆分配的数组
测试代码:
代码 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。 -
代码 1 不适合我,也不应该编译。您作为数组大小传递的值必须是
constexpr,但这里显然不是。 -
另外
std::vector testcase 应该只分配 1 个堆,除非有我们没有看到的代码会增加它的大小。 -
这里有几个选项:godbolt.org/z/Gv1oGM。代码中的一些错误:向量一个复制整个向量,因为您通过值传递与其他向量不具有可比性(通过引用传递或传递
data()指针)。您应该使用new char[len]分配len字节的字符。代码 2 中存在内存泄漏,因为您没有delete[] array。
标签: c++ arrays compiler-explorer