"对几组sizeof信息的分析"一文补充
2004-07-09 18:39
459 查看
实例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;
}
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;
}
相关文章推荐
- 对几组sizeof信息的分析
- 亲自动手测试PetShop4.0中所谓的"允许中间层对象缓存在后端数据库信息更改时自动失效"
- VC|MFC内存不能为"read",内存不能为 "written" 分析
- "陷阱"技术探秘 ──动态汉化Windows技术的分析
- "分析器错误信息: 未能加载类型“WebApplication1.Global”。"类似问题总结。
- "A".substring(1)不报异常的分析
- "此页的状态信息无效,可能已损坏"的解决方法
- "服务器不能完成你的请求。有关详细信息请单击‘详细信息按钮’"
- 添加头信息,为"文件下载/另存为"对话框指定默认文件名.........................
- "Unable to find record. No key specified"错误分析及解决办法
- "听"的重要!CS中各类声音信息详解
- "此页的状态信息无效,可能已损坏"的原因和解决方法
- "尚未注册网络"错误信息的解决办法
- 针对"不重新发送信息,则无法刷新网页。"的终极解决方法。(php&java范例)
- VC|MFC内存不能为"read",内存不能为 "written" 分析
- "[转]以下一些使用ASP.NET和VS.NET2003的经验和技巧," 一文的评论:
- "SQL Server 安装程序无法获取 ASPNET 帐户的系统帐户信息 "
- "陷阱"技术探秘──动态汉化Windows技术的分析
- "无法启动应用程序,工作组信息文件丢失,或是已被其他用户已独占方式打开"在VC中解决办法
- Java设计模式之从"我想请个秘书!"分析外观(Facade)模式