预处理

一、不使用sizeof,如何求内置类型占用的字节?
一般可用如下方式实现:

#define MySizeof(Value)  (char*)(&Value+1)-(char*)&Value

该宏定义中,(char*)&Value返回Value地址的第一个字节,(char*)(&Value+1)返回Value地址的下一个地址的第一个字节,所以他们的差为所占的字节数。

二、如何使用宏求结构体的内存偏移地址?

#define OffSet(type,field)  ((size_t)&((type*)0->field))

在C语言中,ANSI C标准允许值为0的常量被强制转换成任何一种类型的指针,而且转换结果是一个空指针,即NULL。(type*)0就是一个类型为type的NULL指针,&((type*)0->field)是计算结构体中field字段的地址。同时因为地址为0,所以这个地址的值就是字段相对于结构体基址的偏移。size_t一般用来表示一种计数,比如有多少东西被拷贝等。例如:sizeof操作符的结果类型是size_t,该类型保证能容纳实现所建立的最大对象的字节大小,在32位系统中size_t是4字节的,在64位系统中,size_t是8字节的,这样利用该类型可以增加程序移植性。

使用宏求结构体的内存偏移地址,避免了一个实例化type对象,而且求值在编译期进行,没有运行期负担,程序效率大大提高。

三、如何用sizeof判断数组中有多少元素?

#define Count  (sizeof(array)/sizeof(array[0]))
#define Count  (sizeof(array)/sizeof(数组的类型,如int double等))

四、typedef和define有什么区别?
typedef和define都是替一个对象取一个别名,以此来增强程序的可读性,它们在使用和作用上存在以下几方面的不同:

  1. define是预处理指令,在预处理时进行简单的字符串替换,不做正确性检查;typedef是关键字,它在编译时处理,有类型检查的功能,它在自己的作用域内给一个已经存在的类型一个别名,typedef定义数组、指针、结构等类型将带来很大的方便,使程序书写简单且意义更加明确,增强了可读性。
  2. typedef用来定义类型的别名,不仅包括内部类型,还包括自定义类型;define不仅可以为类型取别名,还可以定义常量、变量、编译开关等。
  3. #define没有作用域的限制,而typedef有自己的作用域,不过一般不再函数内使用typedef.
      #define intptr1 int*
      typedef int* intptr2;
      intptr1 p1,p2; 
      intptr2 p3,p4;
 intptr1 p1,p2替换为int* p1,p2,而intptr2 p3,p4相当于int* p3,*p4,宏替换是不含任何意义的替换,而typedef为一种数据类型起的别名是带有一定含义的

五、C++中struct与class的区别是什么?
class的数据成员在内存中的布局不一定是数据成员的声明顺序,struct则是按声明顺序存储结构体成员的;
在做类型定义时,首先默认继承权限class是private继承,而struct默认public继承;其次class还用于定义模板参数,像typename,struct不用于定义模板参数;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值