`std::alignment_of` versus `alignof`

`std::alignment_of` versus `alignof`

本文关键字:versus alignof of alignment std      更新时间:2023-10-16

我刚刚偶然发现了std::alignment_of类型的特征,它很快就会成为std::alignment_of_v的朋友。它们似乎被专门设计为等效于对alignof的普通调用,而_v助手的未来添加表明它不仅仅是一个遗留位。

当我们有alignof时,std::alignment_of_v)有什么用?

它们几乎完全是多余的。正如@Revolver所指出的,它们在不同的论文中被介绍,alignment_of几乎逐字逐句地来自boost

但这并不意味着这种特质毫无用处。

template<class...>class可以传递给其他template,并与元编程一起使用。像alignof这样的运算符不能:必须先编写template<class>class alignment_of,然后才能将其传递给元编程工具。

现在sizeof需要std::size_of<class>模板也是如此。

添加_v是因为他们扫描了std中每个::valueintegral_constant类型模板中的,并添加了一个_v变量模板。考虑到哪些地方值得画,哪些地方不值得画,这几乎是毫无意义的:做每一件都比花精力挑选值得做的更容易。这并不能证明这一功能没有过时。

std::alignment_of被引入作为Boost类型特征库的端口。它早于C++11和alignof关键字。该特性已被alignof运算符取代,但保留它主要是为了兼容性(因此您可以用std::替换boost::),并且引入了_v变量别名以与库的其他部分保持一致。

我在实践中发现的一件好事是,alignof在语法上对旧代码无效,而alignment_of只是一个标准模板。因此,您可以通过使用编译器接受的任何替代语法提供alignment_of的实现来与较旧的编译器保持兼容,然后在任何地方使用它。