iOS Developer

ios拓展31-宏(define)和const的正确姿势

2017-02-23  本文已影响129人  Abler

在iOS开发中,经常用到宏定义,但是网上看一些博客的时候,有的说宏定义大量使用会重复拷贝,占用内存. 有的说不会.笔者测试了一下

1.代码(define)
#import "ViewController.h"
#define X_NAME @"zha"
#define X_int 1
@implementation ViewController
- (void)viewDidLoad {
    [super viewDidLoad];
    NSString *st1 = X_NAME;
    NSString *st2 = X_NAME;
    NSLog(@"%p===%p",st1,st2);

    int a1 = X_int;
    int a2 = X_int;
    NSLog(@"%p===%p",&a1,&a2);
}
2.打印结果
结果
3.根据上述结果推测

***- 1宏:只是在预处理器里进行文本替换,没有类型,不做任何类型检查,编译器可以对相同的字符串进行优化。只保存一份到 .rodata 段。甚至有相同后缀的字符串也可以优化,你可以用GCC 编译测试,"Hello world" 与 "world" 两个字符串,只存储前面一个。取的时候只需要给前面和中间的地址,


4.额外测试(oc和c++结果一样)
#include <iostream>
#define X_int 1

int main(int argc, const char * argv[]) {
    std::cout << "Hello, World!\n";
    
    int a1 = X_int;
    int a2 = X_int;
    printf("%p===%p\n",&a1,&a2);
    int const a = 1;
    int aa1 = a;
    int aa2 = a;
    printf("%p===%p",&aa1,&aa2);
    printf("\n==%p",&a);
    
    return 0;
}
额外测试结果
5.内存占用(个人观点,如果有错误,还请指教)

地址的变化,是由于基本数据类型本身造成的. 因此,使用宏定义不会增加内存使用.

6.总结

const 与 #define的比较
C++ 语言可以用const来定义常量,也可以用 #define来定义常量。但是前者比后者有更多的
优点:

缺点:

上一篇下一篇

猜你喜欢

热点阅读