两次创建对齐的结构数据时出现C++分段错误



我正在尝试编写一些对性能至关重要的c++代码。因此,我使用AVX内部函数,需要将数据对齐到32字节。

我正在使用一个结构,它看起来类似于:(我注释掉了它的一部分来跟踪问题(

struct Summation {
alignas(ALIGNMENT) float summation[HIDDEN_SIZE] {};
Summation() {
//        std::memcpy(summation, inputBias, sizeof(float) * HIDDEN_SIZE);
}
Summation& operator=(const Summation& other) {
//        std::memcpy(summation, other.summation, sizeof(float) * HIDDEN_SIZE);
return *this;
}
};

struct Evaluator {
Evaluator(){}
// inputs and outputs
bool inputMap[INPUT_SIZE] {};

// bias
alignas(32) float input_bias[HIDDEN_SIZE] {};
alignas(32) float hidden_bias {};

// weights
alignas(32) float input_weights[INPUT_SIZE][HIDDEN_SIZE] {};
alignas(32) float hidden_weights[HIDDEN_SIZE] {};
alignas(32) float activation[HIDDEN_SIZE] {};
std::vector<Summation> summations {};

编译这项工作没有任何问题,并运行以下工作没有任何任何问题:

nn::Evaluator ev1{};

当我尝试创建第二个Evaluator时,问题出现了:

nn::Evaluator ev1{};
nn::Evaluator ev2{};

--> 
Process finished with exit code -1073741571 (0xC00000FD)

我把这个问题追溯到的创建

alignas(32) float input_weights[INPUT_SIZE][HIDDEN_SIZE] {};

然而,我不知道为什么在创建第二个Evaluator对象但只使用单个Evaluator时会出现问题。我很高兴得到任何帮助。

我已经发现了这个问题。事实证明,这不是对齐,而是堆栈上的分配。由于与包含的其他数据相比,2d数组非常大,因此它在堆栈上分配了太多内存,并导致堆栈溢出。

最新更新