【发布时间】:2021-05-26 17:47:09
【问题描述】:
我正在尝试实现自己的数学库,并且从向量开始。这个想法是给类一个指向数字数组的指针,然后复制数组并将其存储在私有变量指针给出的数据地址中。首先,我使用alloca 尝试为私有变量释放一些内存
vml.h
namespace vml {
// Vectors
template <typename in_type, const int in_length>
class vec {
public:
vec(in_type* in_data) {
std::cout << data << std::endl;
std::copy(in_data, in_data + in_length, data);
}
vec() {
data = nullptr;
}
in_type& operator()(int index) const {
_ASSERT(0 <= index && index < in_length);
return data[index];
}
private:
in_type* data = alloca(in_length * sizeof(in_type));
};
main.cpp
int main() {
int list[] = { 1,2,3 };
int list2[] = {2,4,6 };
vml::vec<int, 3> a(list);
vml::vec<int, 3> b(list);
return 0;
}
这不会出错,但是由于某种原因,alloca 在调用两个实例时会两次返回相同的地址。我到处搜索这个,我找不到解释为什么。所以我决定使用数组分配内存。如果你能回答这个问题,那将是非常有帮助的。
谢谢。
【问题讨论】:
-
您确实将
operator()声明为const -
1st) 使用
alloca()(在 C++ 中)通常是个坏主意。 2nd) 对成员变量使用alloca()在我看来是一个特别糟糕的主意。考虑到alloca()是用于临时的。函数中的本地存储(在 C 中)...(我记得 alloca() 只是为了确保我没有遗漏或混淆某些东西...) -
无法重现(即使有修复以使代码编译)您在第一种情况下描述的行为。错误消息是因为无法返回对
const对象的(非可变)成员的非const引用。将operator()的返回类型更改为const in_type &。赋值data = nullptr在第二种情况下也不应该编译,但你没有提到。 -
当您使用编译时间常数作为数据长度时,只需将手动内存管理替换为
std::array这将根据您的需要将数据放在堆栈上。
标签: c++ arrays allocation alloca