程序使用clang ++编译,但g ++耗尽RAM并失败

hfh*_*hc2 5 c++ enums g++ c++11 clang++

我考虑过这里介绍的基于C++ 11的枚举bitset .我想出了一些示例程序:

#include <bitset>
#include <type_traits>
#include <limits>

template <typename TENUM>
class FlagSet {

private:
  using TUNDER = typename std::underlying_type<TENUM>::type;
  std::bitset<std::numeric_limits<TUNDER>::max()> m_flags;

public:
  FlagSet() = default;

  FlagSet(const FlagSet& other) = default;
};

enum class Test
{
  FIRST,
  SECOND
};


int main(int argc, char *argv[])
{
  FlagSet<Test> testFlags;
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

该程序使用clang ++(clang版本3.8.1(标签/ RELEASE_381/final))编译好clang++ -std=c++11 -o main main.cc.但是,如果我g++ -std=c++11 -o main main.cc改为使用g ++(g ++(GCC)6.2.1 20160830),编译器最终会耗尽系统内存.这是g ++的问题还是这个代码不符合标准?

eca*_*mur 5

std::bitset<std::numeric_limits<TUNDER>::max()>大小为256 MiB(假设为32位int).clang成功编译它很棒,但gcc内存不足并不奇怪.

如果您打算将枚举数用作bitset索引,则必须将最大的枚举器作为单独的模板参数传递; 还有(C++枚举中的最大值和最小值)无法找到枚举的范围.

例:

template <typename TENUM, TENUM MAX>
class FlagSet {

private:
  std::bitset<MAX + 1> m_flags;

public:
  FlagSet() = default;

  FlagSet(const FlagSet& other) = default;
};

enum class Test
{
  FIRST,
  SECOND,
  MAX = SECOND
};

FlagSet<Test, Test::MAX> testFlags;
Run Code Online (Sandbox Code Playgroud)

  • @Yakk抱歉,你说得对; 唯一的保证([dcl.enum]/7)是它应该不大于`int`,如果它适合`int`; 实际大小是实现定义的.事实上,对于适合`int`的非固定枚举,看起来x86和Windows ABI都使用`int`. (2认同)