如何解决如何正确使用 std::align
我认为 std::align
作为运行时地址计算来满足我的程序的进一步逻辑是否正确,即如果程序逻辑不考虑任何特定的对齐,则没有意义使用 std::align
?
使用 std::align
会影响代码生成吗?我的理解是否正确,与 C++20 中的 std::assume_aligned
不同,std::align
不是对编译器的提示?
解决方法
std::align
是一个普通的自由函数。这不是编译器提示,不涉及魔法。它确实会影响代码生成,因为任何其他函数都可能影响代码生成,即它可能会被内联、重新排序等,但不会以任何特定方式。
关于函数的作用和使用时间(cppreference):
给定一个指向大小空间缓冲区的指针 ptr,返回一个指针,该指针按指定的对齐方式对齐,用于大小字节数,并将空间参数减少用于对齐的字节数。返回第一个对齐的地址。
因此它是运行时构造,它执行一些指针算术以返回可用于所需对齐的地址。想象一下,您想在某个内存地址存储一个 std::int64_t
,但您不知道它是否已经正确对齐(因为它位于用 std::malloc
分配的某个缓冲区的中间),然后 {{1} } 是你的朋友。
这是 libstdcxx 实现:
std::align
它用于例如在 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);
}
}
中 - 这正是此函数的用例。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。