微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何正确使用 std::align

如何解决如何正确使用 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 举报,一经查实,本站将立刻删除。