为什么 mi 代码在 SSE2 中编译正常,但在 ARM(没有 NEON)中却不行?

Why mi code compiles ok in SSE2 but not in ARM(no NEON)?

好吧,这就是问题所在:我试图在 ARM 中编译我的 altoin,但出现堆栈粉碎错误:。中止。然后,我尝试在我的另一台 linux 计算机上编译完全相同的代码,但使用 SSE2 标志,它成功了。如果我禁用 makefile 上的堆栈保护,我将能够编译。但是禁用它不是个好主意。我尝试使用较旧的 GCC,但没有什么是一样的。我的问题是,为什么我可以在 SSE2 指令中编译但在 ARM 中不能? 这是在构建日志中创建警告的代码:

double GaussianQuad_N(double func(const double), const double a2, const double b2, int NptGQ)
{
    double s = 0.0;
    double x[NptGQ], w[NptGQ];

    gauleg(a2, b2, x, w, NptGQ);
    for (int j = 1 ; j <= NptGQ ; j++)
        s += w[j] * func(x[j]);

    return s;
}

我得到:

warning: stack protector not protecting local variables: variable length buffer [-Wstack-protecto ] double GaussianQuad_N(double func(const double)

double x[NptGQ], w[NptGQ]; 可变长度数组在 C++ 中不是标准的。在 C++ 中使用 std::vector

std::vector<double> x(NptGQ), w(NptGQ);
gauleg(a2, b2, x.data(), w.data(), NptGQ);

您的数组大小为 NptGQ,这意味着有效索引为 0 到 NptGQ-1。但是,您的循环从 1 到 NptGQ,因此最后一次迭代将超出数组的末尾。

运行 像这样离开数组的末尾会导致未定义的行为——它可能会起作用(如果数组后面的 space 中没有重要内容)或者它可能会崩溃或出现其他异常行为。