ostream 在堆上使用对齐内存崩溃?
ostream crash using aligned memory on heap?
这是我的一个虚拟代码,用 "huge" 值测试堆上的对齐内存分配:
#include <iostream>
#include <iomanip>
#include <immintrin.h>
const double ln2per12 = std::log(2.0) / 12.0;
class ApproxExp
{
public:
long step = 1000;
long min = -48 * step;
long max = 48 * step;
long range = max - min;
long numSteps = range + 1;
__m128 v_value_float;
float *approxFreqMuls_Float = static_cast<float*>(_mm_malloc(sizeof(float) * numSteps, 16));
ApproxExp() {
long inc = min;
for (long i = 0; i < numSteps; i++, inc++) {
double pitch = inc / (double)step;
double refValue = pitch * ln2per12;
v_value_float.m128_f32[i % 4] = (float)refValue;
if (i % 4 == 3 || i == numSteps - 1) {
_mm_store_ps(&approxFreqMuls_Float[i % 4 == 3 ? i - 3 : i - i % 4], v_value_float);
}
}
std::cout << "oct ";
}
~ApproxExp() {
_mm_free(approxFreqMuls_Float);
}
};
int main() {
std::cout.precision(100);
std::cout << std::left;
ApproxExp approxExp;
return 0;
}
当我执行它时,"sometimes" 它残酷地中断(释放模式,MSVC
),显示如下:
我找不到错误,因为我没有看到任何异常代码。我哪里错了?
如果到达最后一个索引且其余数不是 3,则在索引 i - i % 4
处写入 128 位将写入数组外部。
然后你就进入了未定义行为的美妙国度。
这是我的一个虚拟代码,用 "huge" 值测试堆上的对齐内存分配:
#include <iostream>
#include <iomanip>
#include <immintrin.h>
const double ln2per12 = std::log(2.0) / 12.0;
class ApproxExp
{
public:
long step = 1000;
long min = -48 * step;
long max = 48 * step;
long range = max - min;
long numSteps = range + 1;
__m128 v_value_float;
float *approxFreqMuls_Float = static_cast<float*>(_mm_malloc(sizeof(float) * numSteps, 16));
ApproxExp() {
long inc = min;
for (long i = 0; i < numSteps; i++, inc++) {
double pitch = inc / (double)step;
double refValue = pitch * ln2per12;
v_value_float.m128_f32[i % 4] = (float)refValue;
if (i % 4 == 3 || i == numSteps - 1) {
_mm_store_ps(&approxFreqMuls_Float[i % 4 == 3 ? i - 3 : i - i % 4], v_value_float);
}
}
std::cout << "oct ";
}
~ApproxExp() {
_mm_free(approxFreqMuls_Float);
}
};
int main() {
std::cout.precision(100);
std::cout << std::left;
ApproxExp approxExp;
return 0;
}
当我执行它时,"sometimes" 它残酷地中断(释放模式,MSVC
),显示如下:
我找不到错误,因为我没有看到任何异常代码。我哪里错了?
如果到达最后一个索引且其余数不是 3,则在索引 i - i % 4
处写入 128 位将写入数组外部。
然后你就进入了未定义行为的美妙国度。