Note that there are some explanatory texts on larger screens.

plurals
  1. PO
    text
    copied!<p>No, you can't change it. What do you hope to learn from seeing an implementation of it?</p> <p>What <code>sizeof</code> does can't be written in C++ using more basic operations. It's not a function, or part of a library header like e.g. <code>printf</code> or <code>malloc</code>. It's inside the compiler.</p> <p>Edit: If the compiler is itself written in C or C++, then you can think of the implementation being something like this:</p> <pre><code>size_t calculate_sizeof(expression_or_type) { if (is_type(expression_or_type)) { if (is_array_type(expression_or_type)) { return array_size(exprssoin_or_type) * calculate_sizeof(underlying_type_of_array(expression_or_type)); } else { switch (expression_or_type) { case int_type: case unsigned_int_type: return 4; //for example case char_type: case unsigned_char_type: case signed_char_type: return 1; case pointer_type: return 4; //for example //etc., for all the built-in types case class_or_struct_type: { int base_size = compiler_overhead(expression_or_type); for (/*loop over each class member*/) { base_size += calculate_sizeof(class_member) + padding(class_member); } return round_up_to_multiple(base_size, alignment_of_type(expression_or_type)); } case union_type: { int max_size = 0; for (/*loop over each class member*/) { max_size = max(max_size, calculate_sizeof(class_member)); } return round_up_to_multiple(max_size, alignment_of_type(expression_or_type)); } } } } else { return calculate_sizeof(type_of(expression_or_type)); } } </code></pre> <p>Note that is is very much pseudo-code. There's lots of things I haven't included, but this is the general idea. The compiler probably doesn't actually do this. It probably calculates the size of a type (including a class) and stores it, instead of recalculating every time you write <code>sizeof(X)</code>. It is also allowed to e.g. have pointers being different sizes depending on what they point to.</p>
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload