读取 /编写部分分配的对齐内存
Read / write partially allocated aligned memory
关于访问未分配记忆的问题有一个 lot ,这显然是未定义的行为。但是以下角色呢?
考虑以下结构,该结构与16个字节保持一致,但仅占8个字节:
struct alignas(16) A
{
float data[2]; // the remaining 8 bytes are unallocated
};
现在,我们访问SSE对准负载/存储内在的16个数据:
__m128 test_load(const A &a)
{
return _mm_load_ps(a.data);
}
void test_store(A &a, __m128 v)
{
_mm_store_ps(a.data, v);
}
这也是未定义的行为,我应该使用填充吗?
无论如何,由于Intel Interins不是标准的C ,因此正在访问标准C ?
i同时解决内在案例和标准C 情况。我对他们两个都感兴趣。
另请参阅x86和x64上同一页面中的缓冲区末端读取缓冲区的末端是否安全?这个问题的阅读部分基本上是对此的重复。
根据ISO C 标准是UB,但我认为这样的仅阅读访问确实可以安全起作用(即您期望的ASM汇编)在提供Intel Intrinsics的实现(可以自由定义额外的任何内容)上他们想要的行为)。在ASM中,这绝对是安全的,但是风险是优化将UB转换为错误编译的代码的C 编译器,如果他们能证明没有什么可阅读的,可能会导致问题。关于链接的问题有一些讨论。
在对象外写作总是不好的。不要这样做,即使您放回了之前阅读的相同垃圾:非原子负载/商店对也可能是一个问题,具体取决于您的结构的数据。
这唯一可以在一个阵列中,您知道接下来会发生什么,并且有未使用的填充。例如使用16B商店与4B重叠的16B商店编写3-float
结构的数组。(没有alignas
进行过度对齐,因此一个数组将它们包装在一起而无需填充)。
3 float
s的结构比2 floats
要好得多。
对于此特定示例(2个浮子),您只需使用MovsD即可进行64位零延伸负载,然后MovsD或Movlps可以在__m128
的低半处进行64位商店。
语言律师对此的回答是'问题是毫无意义的。_mm_load_ps
未在标准中定义,并且它使用的是ASM指令,该指令也不在标准中定义。C 不处理此。
至于您的第二个问题 - 从C 访问未分配的内存显然是未定义的行为。在此内存中没有任何对象,因此您无法访问它。
- 使 std::vector 分配对齐内存的现代方法
- 在 capnp FlatArrayMessageReader 的对齐内存缓冲区中接收 zmq 消息
- Linux C++ 中的页面对齐内存分配
- 对于堆上的页面对齐内存分配是否有任何优化或不同的 API?
- 如何使用此宏测试是否对齐内存
- g++ 如何对齐内存以确保对齐从缓存行的开头开始?
- 正确对齐内存模板,参数顺序不变
- 在 C/C++ 中在特定地址边界上对齐内存是否仍能提高 x86 性能?
- 读取 /编写部分分配的对齐内存
- 指向对齐内存的指针
- 在C++11中,推荐的对齐内存的方法是什么
- C++-对齐内存
- m = XMMatrixIdentity() - 类中的对齐内存后崩溃
- 新字符是否实际上保证类类型的对齐内存
- 分配32字节对齐内存的分配器
- 如何从操作符new或mremap的malloc中获取页对齐内存
- 新 char[] 产生对齐内存的标准要求C++背后的意图是什么?
- 未对齐内存访问:它是定义的行为或不
- 在c++中声明、操作和访问未对齐内存
- c++ 11中的动态对齐内存分配