Where do I find the definition of size_t?

前端 未结 9 2129
醉酒成梦
醉酒成梦 2020-11-28 04:37

I see variables defined with this type but I don\'t know where it comes from, nor what is its purpose. Why not use int or unsigned int? (What about other \"similar\" types?

相关标签:
9条回答
  • 2020-11-28 04:45

    According to size_t description on en.cppreference.com size_t is defined in the following headers :

    std::size_t
    
    ...    
    
    Defined in header <cstddef>         
    Defined in header <cstdio>      
    Defined in header <cstring>         
    Defined in header <ctime>       
    Defined in header <cwchar>
    
    0 讨论(0)
  • 2020-11-28 04:46

    size_t is the unsigned integer type of the result of the sizeof operator (ISO C99 Section 7.17.)

    The sizeof operator yields the size (in bytes) of its operand, which may be an expression or the parenthesized name of a type. The size is determined from the type of the operand. The result is an integer. The value of the result is implementation-defined, and its type (an unsigned integer type) is size_t (ISO C99 Section 6.5.3.4.)

    0 讨论(0)
  • 2020-11-28 04:51

    Practically speaking size_t represents the number of bytes you can address. On most modern architectures for the last 10-15 years that has been 32 bits which has also been the size of a unsigned int. However we are moving to 64bit addressing while the uint will most likely stay at 32bits (it's size is not guaranteed in the c++ standard). To make your code that depends on the memory size portable across architectures you should use a size_t. For example things like array sizes should always use size_t's. If you look at the standard containers the ::size() always returns a size_t.

    Also note, visual studio has a compile option that can check for these types of errors called "Detect 64-bit Portability Issues".

    0 讨论(0)
  • 2020-11-28 04:54

    I'm not familiar with void_t except as a result of a Google search (it's used in a vmalloc library by Kiem-Phong Vo at AT&T Research - I'm sure it's used in other libraries as well).

    The various xxx_t typedefs are used to abstract a type from a particular definite implementation, since the concrete types used for certain things might differ from one platform to another. For example:

    • size_t abstracts the type used to hold the size of objects because on some systems this will be a 32-bit value, on others it might be 16-bit or 64-bit.
    • Void_t abstracts the type of pointer returned by the vmalloc library routines because it was written to work on systems that pre-date ANSI/ISO C where the void keyword might not exist. At least that's what I'd guess.
    • wchar_t abstracts the type used for wide characters since on some systems it will be a 16 bit type, on others it will be a 32 bit type.

    So if you write your wide character handling code to use the wchar_t type instead of, say unsigned short, that code will presumably be more portable to various platforms.

    0 讨论(0)
  • 2020-11-28 04:59

    size_t should be defined in your standard library's headers. In my experience, it usually is simply a typedef to unsigned int. The point, though, is that it doesn't have to be. Types like size_t allow the standard library vendor the freedom to change its underlying data types if appropriate for the platform. If you assume size_t is always unsigned int (via casting, etc), you could run into problems in the future if your vendor changes size_t to be e.g. a 64-bit type. It is dangerous to assume anything about this or any other library type for this reason.

    0 讨论(0)
  • 2020-11-28 05:00

    From Wikipedia

    The stdlib.h and stddef.h header files define a datatype called size_t1 which is used to represent the size of an object. Library functions that take sizes expect them to be of type size_t, and the sizeof operator evaluates to size_t.

    The actual type of size_t is platform-dependent; a common mistake is to assume size_t is the same as unsigned int, which can lead to programming errors,2 particularly as 64-bit architectures become more prevalent.

    From C99 7.17.1/2

    The following types and macros are defined in the standard header stddef.h

    <snip>

    size_t

    which is the unsigned integer type of the result of the sizeof operator

    0 讨论(0)
提交回复
热议问题