【发布时间】:2019-05-10 04:57:58
【问题描述】:
考虑this example on Compiler explorer。
基本上,我们有这个代码sn-p:
#include <cstdint>
#include <variant>
enum class Enum1 : std::uint8_t { A, B };
enum class Enum2 : std::uint8_t { C, D };
using Var = std::variant< Enum1, Enum2 >;
using Var2 = std::variant< char >;
template< std::size_t s >
struct print_size;
void func() {
print_size< sizeof( Var ) >{};
print_size< sizeof( Var2 ) >{};
}
如果我们使用 GCC 的 libstdc++(使用 clang 或 GCC)编译它,我们会得到预期的编译错误:
error: implicit instantiation of undefined template 'print_size<2>'
另外,与 MSVC 类似(如预期的那样):
error C2027: use of undefined type 'print_size<2>'
但是,当使用带有 libc++ 的 clang 时,我得到了这个错误:
error: implicit instantiation of undefined template 'print_size<8>'
这表示sizeof( std::variant< char > ) == 8 在使用 libc++ 时。我已经在 Linux 上确认了这一点(请参阅上面的编译器资源管理器链接),但也可以在 Android 的 NDK r18 和 Xcode 10(iOS 和 MacOS)上使用。
libc++ 的std::variant 实现是否有理由使用这么多内存,或者这只是 libc++ 中的一个错误,应该报告给 libc++ 开发人员?
【问题讨论】:
-
这是质量上的差异。 libc++的质量大概可以和clang的质量媲美。还要检查访问者的丑陋实现
-
当我为 lldb 编写 std::variant 的格式化程序并记录了 implementation of std::variant 并且它有两个成员
__index和__data我不记得为什么但__index通常是 unsigned int`,它解释了大小 see godbolt -
我相信这个问题很清楚,不知道为什么反对票或投票结束。
-
@Shafik 因为他们提出了一个特定于实现的问题,并且无法通过参考标准来回答,而且 C++ 标签中许多更活跃的用户都讨厌这个问题。出于这个原因,我经常把 C++ 标签去掉。 “不清楚”的密切原因只是这些人使用的一个虚假原因,因为没有一个密切的原因真正适合。问题很明确。
标签: c++ c++17 libc++ std-variant