这些整数没有对齐吗?我应该关心吗
Are these integers misaligned, and should I even care?
我有一些代码可以解释任意地址的字节数组中的多字节宽度整数。
std::vector<uint8> m_data; // filled with data
uint32 pos = 13; // position that might not be aligned well for 8 byte integers
...
uint64 * ptr = reinterpret_cast<uint64*>(m_data.data() + pos);
*ptr = swap64(*ptr); // (swaps endianness)
对齐是否会成为此代码的问题?如果是,这是一个严重的问题,还是一个可以安全地忽略的问题,因为处罚微不足道?
改用memcpy
:
uint64_t x;
memcpy(&x, m_data.data()+pos, sizeof(uint64_t));
x = swap(x);
memcpy(m_data.data()+pos, &x, sizeof(uint64_t));
它有两个好处:
- 您可以避免严格的混叠冲突(将
uint8_t
缓冲区读取为uint64_t
引起( - 你根本不必担心错位(你确实需要关心错位,因为即使在x86上,如果编译器自动向量化你的代码,它也可能崩溃(
当前的编译器足够好,可以做正确的事情(即,您的代码不会很慢,memcpy
可以识别,并且处理得很好(。
一些体系结构需要对齐读取才能工作。如果对齐不正确,它们会抛出处理器信号。
根据平台的不同,它可以
- 程序崩溃
- 导致使用未对齐的读取重新运行。(性能命中(
- 只需正确工作
执行性能度量是一个良好的开端,检查目标平台的操作系统规范将是谨慎的。
相关文章:
- 我应该使用什么来代替void作为变体中的替代类型之一
- boost::asio::steady_timer()与sleep()我应该使用哪一个
- 我应该实现右值推送功能吗?我应该使用std::move吗
- 我是C++编程的新手,这些代码之间有什么区别,我应该使用哪一个
- 我应该删除矢量<short>吗?
- 我应该如何修改此代码以使用给定字符串中的字母打印菱形图案
- 我应该在锁定TBitmap画布后解锁它吗
- 为什么我应该在异常处理中使用std::cerr而不是std::cout
- 我应该避免多重实现继承吗
- 为了方便起见,我应该避免公开私有字段变量吗
- 我收到同义重复编译器错误。我应该如何修复"类型"X"的参数与类型"X"的参数不兼容?
- 违反const正确性:我应该现实地期待什么问题
- 我应该如何表示我拥有的连续元素序列?
- 我应该将除 .cpp 以外的其他文件添加到 git 中吗?
- 我应该如何从 stdin C++ 中读取可变长度的格式字符串?
- 我有一个对象,它将在整个程序的持续时间内实例化,但一个类成员不会,我应该动态分配它吗?
- 我应该如何捕捉out_of_range异常?
- 我应该声明所有不抛出 noexexcept 的成员/函数吗?
- 这些整数没有对齐吗?我应该关心吗
- 为什么我应该关心boost文档中的EXTENSION注释