Difference between revisions of "cpp/language/sizeof"
(→Example: Consistent quotation mark use and let tabular data resemble a table) |
(~) |
||
Line 12: | Line 12: | ||
{{sdsc end}} | {{sdsc end}} | ||
− | Both versions | + | Both versions are constant expressions of type {{lc|std::size_t}}. |
===Explanation=== | ===Explanation=== | ||
− | @1@ | + | @1@ Yields the size in bytes of the {{rlp|object|object representation}} of {{spar|type}}. |
− | @2@ | + | @2@ Yields the size in bytes of the object representation of the type of {{spar|expression}}, if that expression is evaluated. |
===Notes=== | ===Notes=== | ||
Depending on the computer architecture, a [[enwiki:Byte|byte]] may consist of 8 ''or more'' bits, the exact number being recorded in {{lc|CHAR_BIT}}. | Depending on the computer architecture, a [[enwiki:Byte|byte]] may consist of 8 ''or more'' bits, the exact number being recorded in {{lc|CHAR_BIT}}. | ||
− | {{c|sizeof(char)}}, {{c|sizeof(char8_t)}}, {{c|sizeof(signed char)}}, and {{c|sizeof(unsigned char)}} always | + | {{c|sizeof(char)}}, {{c|sizeof(char8_t)}}, {{c|sizeof(signed char)}}, and {{c|sizeof(unsigned char)}} are always equal to {{c|1}}. |
sizeof cannot be used with function types, incomplete types, or bit-field glvalues. | sizeof cannot be used with function types, incomplete types, or bit-field glvalues. | ||
Line 30: | Line 30: | ||
When applied to a class type, the result is the size of an object of that class plus any additional padding required to place such object in an array. | When applied to a class type, the result is the size of an object of that class plus any additional padding required to place such object in an array. | ||
− | + | The result of {{tt|sizeof}} is always nonzero, even if applied to an empty class type. | |
When applied to an expression, {{tt|sizeof}} does {{rlp|expressions#Unevaluated_expressions|not evaluate the expression}}, and even if the expression designates a polymorphic object, the result is the size of the static type of the expression. Lvalue-to-rvalue, array-to-pointer, or function-to-pointer conversions are not performed. {{rev inl|since=c++17|{{rlp|implicit_cast#Temporary_materialization|Temporary materialization}}, however, is (formally) performed for prvalue arguments: sizeof determines the size of the result object.}} | When applied to an expression, {{tt|sizeof}} does {{rlp|expressions#Unevaluated_expressions|not evaluate the expression}}, and even if the expression designates a polymorphic object, the result is the size of the static type of the expression. Lvalue-to-rvalue, array-to-pointer, or function-to-pointer conversions are not performed. {{rev inl|since=c++17|{{rlp|implicit_cast#Temporary_materialization|Temporary materialization}}, however, is (formally) performed for prvalue arguments: sizeof determines the size of the result object.}} |
Revision as of 18:19, 3 May 2019
Queries size of the object or type.
Used when actual size of the object must be known.
Contents |
Syntax
sizeof( type )
|
(1) | ||||||||
sizeof expression
|
(2) | ||||||||
Both versions are constant expressions of type std::size_t.
Explanation
Notes
Depending on the computer architecture, a byte may consist of 8 or more bits, the exact number being recorded in CHAR_BIT.
sizeof(char), sizeof(char8_t), sizeof(signed char), and sizeof(unsigned char) are always equal to 1.
sizeof cannot be used with function types, incomplete types, or bit-field glvalues.
When applied to a reference type, the result is the size of the referenced type.
When applied to a class type, the result is the size of an object of that class plus any additional padding required to place such object in an array.
The result of sizeof
is always nonzero, even if applied to an empty class type.
When applied to an expression, sizeof
does not evaluate the expression, and even if the expression designates a polymorphic object, the result is the size of the static type of the expression. Lvalue-to-rvalue, array-to-pointer, or function-to-pointer conversions are not performed. Temporary materialization, however, is (formally) performed for prvalue arguments: sizeof determines the size of the result object.(since C++17)
Keywords
Example
The example output corresponds to a system with 64-bit pointers and 32-bit int.
#include <iostream> struct Empty {}; struct Base { int a; }; struct Derived : Base { int b; }; struct Bit { unsigned bit: 1; }; int main() { Empty e; Derived d; Base& b = d; [[maybe_unused]] Bit bit; int a[10]; std::cout << "size of empty class: " << sizeof e << "\n" << "size of pointer: " << sizeof &e << "\n" // << "size of function: " << sizeof(void()) << "\n" // error // << "size of incomplete type: " << sizeof(int[]) << "\n" // error // << "size of bit field: " << sizeof bit.bit << "\n" // error << "size of array of 10 int: " << sizeof(int[10]) << "\n" << "size of array of 10 int (2): " << sizeof a << "\n" << "length of array of 10 int: " << ((sizeof a) / (sizeof *a)) << "\n" << "length of array of 10 int (2): " << ((sizeof a) / (sizeof a[0])) << "\n" << "size of the Derived: " << sizeof d << "\n" << "size of the Derived through Base: " << sizeof b << "\n"; }
Possible output:
size of empty class: 1 size of pointer: 8 size of array of 10 int: 40 size of array of 10 int (2): 40 length of array of 10 int: 10 length of array of 10 int (2): 10 size of the Derived: 8 size of the Derived through Base: 4
See also
C documentation for sizeof
|