基本语言细节--C++之sizeof操作符

1.首先,其不是一个函数,而是一个操作符;简单的说其作用就是返回一个对象或者类型所占的内存字节数。

2.sizeof也可以对一个函数调用求值,其结果是函数返回类型的大小,函数并不会被调用;

3.字节对齐的细节和编译器实现相关,但一般而言,满足三个准则:

1) 结构体 变量的首地址能够被其最宽基本类型成员的大小所整除;
2) 结构体每个成员相对于结构体首地址的 偏移量(offset)都是成员大小的整数倍,如有需要 编译器会在成员之间加上填充字节(internal padding);
3) 结构体的总大小为结构体最宽基本类型成员大小的整数倍,如有需要 编译器会在最末一个成员之后加上填充字节(trailing padding)。
4). 结构体 的大小等于最后一个成员的 偏移量 加上其大小再加上末尾的填充字节数目;
4.来自MSDN的解释:

Yields the size of its operand with respect to the size of type char.

sizeof unary-expression 
sizeof ( type-name )
sizeof unary-expression 
sizeof ( type-name )

The result of the sizeof operator is of type size_t, an integral type defined in the include file STDDEF.H. This operator allows you to avoid specifying machine-dependent data sizes in your programs.

The operand to sizeof can be one of the following:

  • A type name. To use sizeof with a type name, the name must be enclosed in parentheses.

  • An expression. When used with an expression, sizeof can be specified with or without the parentheses. The expression is not evaluated.

When the sizeof operator is applied to an object of type char, it yields 1. When the sizeof operator is applied to an array, it yields the total number of bytes in that array, not the size of the pointer represented by the array identifier. To obtain the size of the pointer represented by the array identifier, pass it as a parameter to a function that uses sizeof. For example:

// expre_sizeof_Operator.cpp
// compile with: /EHsc
#include <iostream>

size_t getPtrSize( char *ptr )
{
   return sizeof( ptr );
}

using namespace std;
int main()
{
   char szHello[] = "Hello, world!";

   cout  << "The size of a char is: "
         << sizeof( char )
         << "\nThe length of " << szHello << " is: "
         << sizeof szHello
         << "\nThe size of the pointer is "
         << getPtrSize( szHello ) << endl;
}
// expre_sizeof_Operator.cpp
// compile with: /EHsc
#include <iostream>

size_t getPtrSize( char *ptr )
{
   return sizeof( ptr );
}

using namespace std;
int main()
{
   char szHello[] = "Hello, world!";

   cout  << "The size of a char is: "
         << sizeof( char )
         << "\nThe length of " << szHello << " is: "
         << sizeof szHello
         << "\nThe size of the pointer is "
         << getPtrSize( szHello ) << endl;
}
The size of a char is: 1
The length of Hello, world! is: 14
The size of the pointer is 4
The size of a char is: 1
The length of Hello, world! is: 14
The size of the pointer is 4

When the sizeof operator is applied to a class, struct, or union type, the result is the number of bytes in an object of that type, plus any padding added to align members on word boundaries. The result does not necessarily correspond to the size calculated by adding the storage requirements of the individual members. The /Zp compiler option and the pack pragma affect alignment boundaries for members.

The sizeof operator never yields 0, even for an empty class.

The sizeof operator cannot be used with the following operands:

  • Functions. (However, sizeof can be applied to pointers to functions.)

  • Bit fields.

  • Undefined classes.

  • The type void.

  • Dynamically allocated arrays.

  • External arrays.

  • Incomplete types.

  • Parenthesized names of incomplete types.

When the sizeof operator is applied to a reference, the result is the same as if sizeof had been applied to the object itself.

If an unsized array is the last element of a structure, the sizeofoperator returns the size of the structure without the array.

The sizeof operator is often used to calculate the number of elements in an array using an expression of the form:

sizeof array / sizeof array[0]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值