是否需要 std::make_unique<T[]> 才能返回对齐的内存?
Is std::make_unique<T[]> required to return aligned memory?
-
是唯一指针
array_ptr
:所拥有的内存吗auto array_ptr = std::make_unique<double[]>(size);
与
sizeof(double)
alignof(double)
边界对齐(即std是否要求正确对齐(? -
数组的第一个元素是缓存行的第一个元件吗?
-
否则:在C++14中实现这一点的正确方法是什么?
动机(更新(:我计划在阵列上使用SIMD指令,由于缓存线是我所知的每一个体系结构上的基本内存单元,我宁愿正确分配内存,使阵列的第一个元素位于缓存线的开头。请注意,只要元素正确对齐(与缓存行之间元素的位置无关(,SIMD指令就可以工作。然而,我不知道这是否有影响,但我猜是的,确实有。此外,我想在内核内的原始内存上使用这些SIMD指令。这是内核的优化细节,所以我不想分配例如__int128而不是int。
-
你"正常"获得的所有对象都是适当对齐的,即在
alignof(T)
对齐(不需要与sizeof(T)
相同。这包括动态数组。(通常,分配器::operator new
只会返回一个最大对齐的地址,这样就不必担心如何使用内存了。( -
C++中没有缓存行。这是一个特定于平台的问题,您需要自己处理(但
alignas
可能会有所帮助(。 -
尝试
alignas
加上静态检查是否有效(因为对过度对齐类型的支持取决于平台(,否则只需添加手动填充即可。您并不真正关心数据是否在缓存行的开始,只关心没有两个数据元素在同一缓存行上。
值得强调的是,对齐实际上不是一个可以在C++中直接检查的概念,因为指针不是数字。它们可以转换为数字,但这种转换除了可逆之外,通常没有意义。你需要像std::align
这样的东西来实际地说"我已经对齐了内存",或者直接在你的类型上使用alignas
。
相关文章:
- 来自 std::list 的迭代器 .end() 按预期返回"0xcdcdcdcdcdcdcdcd"但 .begin()
- 什么时候在C++中返回常量引用是个好主意
- 你能重载对象变量名本身返回的内容吗
- 为什么 Serial.println(<char[]>);返回随机字符?
- C++映射:具有自定义类的运算符[]不起作用(总是返回0)
- 如何获取std::result_of函数的返回类型
- QueryWorkingSet总是返回false
- (C++)分析树以计算返回错误值的简单算术表达式
- 访问者访问变体并返回不同类型时出错
- 如何返回一个类的两个对象相加的结果
- OpenInventor从9.8升级到10.4.2后,GLSL纹理返回零
- lower_bound()返回最后一个元素
- "throw expression code" 1e7 >返回 d 是什么?投掷标准::overflow_error( "too big" ) : d;意味 着?
- 奇怪的(对我来说)返回声明 - 在谷歌上找不到任何关于它的信息
- 如何取消对nullptr的屏蔽,返回正确的对象
- 奇怪的结构&GCC&clang(void*返回类型)
- 架构决策:返回std::future还是提供回调
- 从python中调用C++函数并获取返回值
- 矩阵向量乘法(cublasDgemv)返回零
- 为什么模板类中的对象不能返回值