"对几组sizeof信息的分析"一文补充

博客介绍了C++中sizeof运算符的特性,其输出信息在编译期间确定,编译器一般只取传入表达式的类型信息。通过实例说明不要在sizeof中修改变量,否则可能引发错误。还展示了使用位域的情况,位域可压缩空间。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

实例1
C++ Reference对sizeof运算符的描述信息如下:
The sizeof operator is a compile-time operator that returns the size, in bytes, of the argument passed to it.
也就是说sizeof的输出信息是在编译期间确定的,同时,没有限定编译器对传递给sizeof的表达式具体作何种处理,而实际上,编译器一般的处理方式是只取传入表达式的类型信息进行输出,下面的例子可以说明这一点。

//sizeofdemo1.c
#include <stdio.h>

int
 func(int* pi)
{

    printf("in func/n");
    *
pi++;
    return
 0;
}


int
 main()
{

    int
 i = 0;

    printf("sizeof(func(&i)) = %d/n", sizeof(func(&i))); //这里完全与sizeof(int)等价
    printf("Current value of i is: %d/n", i);
    printf("sizeof(i++) = %d/n", sizeof(i++)); //这里也是
    printf("Current value of i is: %d/n", i);

    printf("sizeof(1.0) = %d/n", sizeof(1.0));

    return
 0;
}


因此,我们不要试图在sizeof中对变量进行修改(在VC中进行程序开发的时候也需要注意,不要试图在ASSERT等宏中进行变量的修改操作,否则,在Release方式下编译的时候,将完全忽略你的程序代码,引起十分难于发现的错误)

实例2
使用位域(bit-field)的情况(C++ Primer说:有一种被称为位域的特殊的类数据成员,它可以被声明用来存放特定数目的位。在类体中相邻定义的位域,如果可能的话,它们会被放在同一个整数的连续位中,并以此提供空间压缩)

//sizeofdemo2.c
#include <stdio.h>

typedef struct
 tagSTRUCT{
    unsigned char
 x:4; //表示占用4个bit
    unsigned char y:4;
}
 STRUCT;

int
 main()
{

    printf("sizeof(STRUCT) = %d/n", sizeof(STRUCT)); //(4 + 4) / 8 = 1

    return
 0;
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值