gpt4 book ai didi

c++ - 英特尔处理器上的未对齐访问存储

转载 作者:行者123 更新时间:2023-11-27 23:51:08 24 4
gpt4 key购买 nike

考虑下面的示例。它在标记行处出现 gcc 5.4 段错误我用 g++ -O3 -std=c++11 编译它。它在指令 movaps 处失败,我怀疑它执行未对齐的内存访问。可能是 gcc 为这样一个简单的示例生成了非法代码,还是我遗漏了什么?我在 Intel i5-5200U 上运行它。

#include <vector>
#include <memory>
#include <cstdint>

using namespace std;

__attribute__ ((noinline))
void SerializeTo(const vector<uint64_t>& v, uint8_t* dest) {
for (size_t i = 0; i < v.size(); ++i) {
*reinterpret_cast<uint64_t*>(dest) = v[i]; // Segfaults here.
dest += sizeof(uint64_t);
}
}

int main() {
std::vector<uint64_t> d(64);

unique_ptr<uint8_t[]> tmp(new uint8_t[1024]);

SerializeTo(d, tmp.get() + 6);

return 0;
}

最佳答案

你在数组中步进了 6 个字节,所以它现在是非对齐的。编译器不知道它必须避免需要对齐的指令;这就是类型双关是未定义行为的原因。

关于c++ - 英特尔处理器上的未对齐访问存储,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46363384/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com