It seems sizeof is not a real function?
for example, if you write like this:
int i=0;
printf("%d\n", sizeof(++i));
printf("%d\n", i);
You may get output like:
4
0
And when you dig into the assemble code, you'll find sth like this:
movl $4, %esi
leaq LC0(%rip), %rdi
xorl %eax, %eax
call _printf
So, the compiler put directly the constant "4" as parameters of printf add call it. Then what does sizeof do?
The sizeof operator gives the amount of storage, in bytes, required to store an object of the type of the operand. This operator allows you to avoid specifying machine-dependent data sizes in your programs.
It is a compile-time unary operator and used to compute the size of its operand. It returns the size of a variable. It can be applied to any data type, float type, pointer type variables. When sizeof() is used with the data types, it simply returns the amount of memory allocated to that data type.
The sizeof keyword refers to an operator that works at compile time to report on the size of the storage occupied by a type of the argument passed to it (equivalently, by a variable of that type). That size is returned as a multiple of the size of a char, which on many personal computers is 1 byte (or 8 bits).
To use the sizeof(), we can take the value using a variable x, using &x, it will print the address of it. Now if we increase the value of &x then it may increase in different way. If only one byte is increased, that means it is character, if the increased value is 4, then it is int or float and so on.
You know, there's a reason why there are standard documents (3.8MB PDF); C99, section 6.5.3.4, §2:
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. If the type of the operand is a variable length array type, the operand is evaluated; otherwise, the operand is not evaluated and the result is an integer constant.
In response to ibread's comment, here's an example for the C99 variable length array case:
#include <stdio.h>
size_t sizeof_int_vla(size_t count)
{
int foo[count];
return sizeof foo;
}
int main(void)
{
printf("%u", (unsigned)sizeof_int_vla(3));
}
The size of foo
is no longer known at compile-time and has to be determined at run-time. The generated assembly looks quite weird, so don't ask me about implementation details...
sizeof
is an operator, not a function.
It's usually evaluated as compile time - the exception being when it's used on C99-style variable length arrays.
Your example is evaluating sizeof(int)
, which is of course known at compile time, so the code is replaced with a constant and therefore the ++
doesn't exist at run-time to be executed.
int i=0;
cout << sizeof(++i) << endl;
cout << i << endl;
It's also worth noting that since it's an operator, it can be used without the brackets on values:
int myVal;
cout << sizeof myVal << endl;
cout << sizeof(myVal) << endl;
Are equivalent.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With