这个枚举的大小是多少,以字节为单位? C ++

时间:2015-10-05 14:11:39

标签: c++

这个枚举的大小是多少,以字节为单位? C ++

enum Cars { Toyota, Suzuki, Volkswa, Mitsubish, Alfarome, Holden, Bradleys };

3 个答案:

答案 0 :(得分:11)

从C ++标准的§7.2/ 5开始,在您的情况下,基础类型不是已修复

  

可以使用枚举基本显式指定基础类型。对于作用域枚举类型,如果未明确指定,则基础类型为int。在这两种情况下,基础类型都被认为是固定的。 [...]

导致§7.2/ 7:

  

对于其基础类型未修复的枚举,基础类型是一个整数类型,可以表示枚举中定义的所有枚举器值。如果没有整数类型可以表示所有枚举器值,则枚举是不正确的。它是实现定义的,其中整数类型用作底层类型,除了底层类型不应大于int,除非枚举器的值不能适合int或unsigned int。如果枚举器列表为空,则基础类型就好像枚举具有值为0的单个枚举器。

总结一下,对于您的枚举,基础类型最多为intunsigned int。您可以通过sizeof检查尺寸,通过typeid检查尺寸。检查使用g ++验证结果的代码的示例(Visual C ++不需要):

#include <iostream>
#include <typeinfo>     // std::type_info
#include <type_traits>  // std::underlying_type
using namespace std;

int const bits_per_byte = CHAR_BIT;

#ifdef __GNUC__
#   include <cxxabi.h>      // abi::*, free
#   include <string>        // std::string

    auto display_name( type_info const& info )
        -> string
    {
        int   status;
        char* demangled = abi::__cxa_demangle( info.name(), 0, 0, &status );
        string result = demangled;
        free( demangled );
        return result;
    }
#else
    auto display_name( type_info const& info )
        -> string
    { return info.name(); }    
#endif // __GNUC__

enum Cars {
    Toyota, Suzuki, Volkswa, Mitsubish, Alfarome, Holden, Bradleys
    };

auto main() -> int
{
    using Cars_type = typename underlying_type< Cars >::type;
    type_info const& info = typeid( Cars_type );
    cout << "This compiler is " << bits_per_byte*sizeof(void*) << "-bit.\n";
    cout << "Underlying type is '" << display_name( info ) << "'.\n";
    cout << "Size = " << sizeof( Cars ) << " bytes.\n";
}

使用MinGW g ++(tdm64-1)5.1.0输出

This compiler is 64-bit.
Underlying type is 'unsigned int'.
Size = 4 bytes.

答案 1 :(得分:4)

大小取决于平台/实施。

在C ++ 11中,您可以指定基础类型(以及大小)。 在以下示例中,大小为1个字节:

#include <iostream>
#include <cstdint>

enum cars : std::uint8_t {
    Toyota, Suzuki, Volkswa, Mitsubish, Alfarome, Holden, Bradleys
};

int main() {
    cars my_car = cars::Toyota;
    std::cout << sizeof(my_car) << std::endl;
};

返回:

1

虽然

enum cars : std::uint32_t { ...

返回:

4

答案 2 :(得分:1)

每个枚举都是一个单独的实体。

编译器需要分配足够的存储空间来保存枚举的最高值。

在您的情况下,有7个实体。编译器需要分配足够的存储空间来保存值7.

可寻址数据类型的最小大小为1.

如果您创建enum类型的变量,则其最小大小必须为1.但是,编译器可以选择更适合该体系结构的大小(平台) ),例如2个字节(16位字),4个字节(32位字)或其他。

如果单独使用枚举项,例如在if语句中,则编译器可能不会分配任何数据存储并将值发送到可执行文件中的指令中。

所以问题的答案是:枚举类型变量的最小空间是1.编译器使用的内容取决于编译器和平台。如果在表达式中使用枚举值,则编译器可以选择将值放入指令中,因此将分配零数据空间。