2016-09-13 4 views
5

here이 도입 된 C++ 11 기반 열거 비트 세트를 고려했습니다. 나는 몇 가지 예제 프로그램을 함께했다 :프로그램이 clang ++을 사용하여 컴파일되지만 g ++이 RAM을 소모하여 실패합니다.

#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; 
} 

이 프로그램은 clang++ -std=c++11 -o main main.cc를 통해 ++ (연타 버전 3.8.1 (태그/RELEASE_381/최종))를 연타를 사용하여 잘 컴파일합니다. 그러나 g ++ (g ++ (GCC) 6.2.1 20160830)를 g++ -std=c++11 -o main main.cc을 통해 대신 사용하면 컴파일러는 결국 시스템 메모리를 소모합니다. 이 문제는 g ++에서 발생합니까? 아니면이 코드가 어떻게 표준을 준수하지 않습니까?

+2

'표준 : 비트 세트 <표준 : : numeric_limits :: 최대()> '즉, 하나의 큰 비트 세트입니다. – Borgleader

+2

g ++ 및 clang이 다른 기본 유형을 사용하는지 궁금합니다. – NathanOliver

+0

@NathanOliver AFAIK enum 클래스의 기본 기본 형식은 32 비트 int입니까? (또는 기본 wtv가 될 수없는 일반 열거 형과 달리 열거 형 클래스를 전달할 수 있기 때문에 표준에 지정된 값이 있습니다.) – Borgleader

답변

5

std::bitset<std::numeric_limits<TUNDER>::max()>은 크기가 256MB입니다 (32 비트 int으로 가정). clang이 컴파일을 성공적으로 수행 한 것은 좋지만 gcc의 메모리가 부족한 것은 놀랄 일이 아닙니다.

열거자를 비트 세트 색인으로 사용하려는 경우 가장 큰 열거자를 별도의 템플릿 매개 변수로 전달해야합니다. 아직 (Max and min values in a C++ enum) 열거 형의 범위를 찾을 방법이 없습니다.

예 :

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; 
+0

어쩌면 OP 예상 max() 열거 형에서 가장 높은 값을 반환하려면 내 추측이었다. 기본 유형의 최대 값을 사용하는 것은 지나치게 과장되어 말하기가 어렵습니다. – Borgleader

+0

글쎄, 나는 여기에서 맹목적으로 복사하고 있었다 : http://stackoverflow.com/a/31906371/1255016 나는 대답을 편집해야한다고 생각한다 ... – hfhc2

+0

@ hfhc2 아 ... 그 대답은 비'class를 사용하고있다. 'enum, 그래서 그것은 기본 타입'char'을 가질 것입니다; 그래서 공간이 여전히 낭비 적이지만 (128 또는 256 비트, 대부분) 컴파일러를 손상시키지 않습니다. – ecatmur

관련 문제