Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Enum Size in Bytes

Tags:

c#

pinvoke

What is the size of the enum below in bytes?

public enum MMTPCnxNckRsn 
{
    MMTPCnxNckRsnNoAnswer = -2, 
    MMTPCnxNckRsnSendError = -1, 
    MMTPCnxNckRsnOk = 0, 
    MMTPCnxNckRsnInvalidMember = 1, 
    MMTPCnxNckRsnHubNotReady = 2, 
    MMTPCnxNckRsnUnknownMember = 3, 
    MMTPCnxNckRsnLastCnxTooRecent = 4, 
    MMTPCnxNckRsnInvalidVersion = 5, 
    MMTPCnxNckRsnInvalidOptions = 6, 
    MMTPCnxNckRsnTooManyCnx = 7 
};

I've used the code below to find it but I think it is not enough. It is a string array with 10 elements. Should I count the chars in each element, assume each char to be 1 byte, and add all bytes of elements? What about unsigned numbers?

var size = Enum.GetNames(typeof(MMTPCnxNckRsn)).Length;
var arr = Enum.GetNames(typeof (MMTPCnxNckRsn));

I'm not sure if it is important to mention that I am in the middle of marshaling a native Win32 code to C#, and it is CRUCIAL to find the size of the enum for managing addresses in memory.

like image 265
Paridokht Avatar asked Jan 06 '14 06:01

Paridokht


People also ask

What is the size of an enum?

On an 8-bit processor, enums can be 16-bits wide. On a 32-bit processor they can be 32-bits wide or more or less. The GCC C compiler will allocate enough memory for an enum to hold any of the values that you have declared. So, if your code only uses values below 256, your enum should be 8 bits wide.

Are enums 32 bit?

The default is -fno-short-enums . That is, the size of an enumeration type is at least 32 bits regardless of the size of the enumerator values.

Can enum be 64 bit?

This means that an enumeration could be 8, 16, 32 or even 64 bits in size; and could change if new enum values were specified.


1 Answers

The documentation says:

The default underlying type of enumeration elements is int.

Therefore, your data type will have the size of 4 bytes, which is the size of an int.
You can confirm this by using the following command:

Marshal.SizeOf(Enum.GetUnderlyingType(typeof(MMTPCnxNckRsn)));

Whilst you refer to the enum values in source code using a name, they are represented in the code that runs on the machine as integer values. So your comment about string arrays is quite wide of the mark.

I also think you are over-thinking the issue of size. Looking at your other recent question, you seem to be translating a C++ structure to C# for pinvoke. Well, the C# enum will map straight onto the C++ enum. The pinvoke marshaller will look after the sizes and lay them out for you. You do not need to handle that explicitly.

like image 131
David Heffernan Avatar answered Oct 13 '22 19:10

David Heffernan