c++ - 如何正确使用 std::align
问题描述
我认为std::align
作为运行时地址计算来满足程序的进一步逻辑是否正确,即如果程序逻辑不考虑任何特定的对齐方式,那么使用它没有意义std::align
吗?
使用 ofstd::align
会影响代码生成吗?我的理解是否正确,与std::assume_aligned
C++20 不同,std::align
它不是对编译器的提示?
解决方案
std::align
是一个普通的自由函数。这不是编译器提示,不涉及魔法。它确实会影响代码生成,因为任何其他函数都可能影响代码生成,即它可能被内联、重新排序等,但不是以任何特定方式。
至于函数的作用和使用时间(cppreference):
给定一个指向大小空间缓冲区的指针 ptr,返回一个按指定对齐方式对齐的指针大小字节数,并通过用于对齐的字节数减少空间参数。返回第一个对齐的地址。
因此,它是运行时构造,它执行一些指针运算以返回可用于所需对齐的地址。想象一下,您想将 a 存储std::int64_t
在某个内存地址,但您不知道它是否已经正确对齐(因为它位于分配给 的某个缓冲区的中间std::malloc
),那么std::align
您就是朋友。
这是 libstdcxx 的实现:
inline void*
align(size_t __align, size_t __size, void*& __ptr, size_t& __space) noexcept
{
if (__space < __size)
return nullptr;
const auto __intptr = reinterpret_cast<uintptr_t>(__ptr);
const auto __aligned = (__intptr - 1u + __align) & -__align;
const auto __diff = __aligned - __intptr;
if (__diff > (__space - __size))
return nullptr;
else
{
__space -= __diff;
return __ptr = reinterpret_cast<void*>(__aligned);
}
}
它用于例如std::monotonic_buffer_resource::do_allocate
- 这正是该函数的用例。
推荐阅读
- python - 使用 BeautifulSoup 和不变的 URL 进行网页抓取
- c# - NSwag:如何在 C# -> Swagger -> C# 客户端中使用自定义值对象类型?
- system-verilog - 随机约束是否可以在子类中,而它已在基类中声明。如果是怎么办?
- node.js - 错误:找不到模块 '.../webpack' Vue js
- c++ - QMediaPlayer 无法在 Window 上播放歌曲
- mysql - SQL GROUP_CONCAT 查询帮助
- java - 在 Android 中使用 ACTION_DIAL 可以同时拨打两个特殊符号
- intellij-idea - 如何使用预提交挂钩使用 IntelliJ 格式格式化代码?
- javascript - 需要在另一个 div 悬停时向 div 添加类
- vue.js - 如何解决在 shopware 中通过 Lightweight 方法创建的 2 个插件之间的冲突?