C++编译器优化

栏目: C++ · 发布时间: 7年前

内容简介:1、volatile:2、NRV(Named Return Value)优化:函数返回一个类,例如下:

1、volatile:

易变性:volatile告诉编译器,某个变量是易变的,当编译器遇到这个变量的时候,只能从变量的内存地址中读取这个变量,不可以从缓存、寄存器、或者其它   任何地方读取。
顺序性:两个包含volatile变量的指令,编译后不可以乱序。注意是编译后不乱序,但是在执行的过程中还是可能会乱序的,这点需要由其它机制来保证,例如memory- barriers。
不可优化性:volatile告诉编译器,不要对这个变量进行各种激进的优化,甚至将变量直接消除,保证代码中的指令一定会被执行。

2、NRV(Named Return Value)优化:

函数返回一个类,例如下:

class X;

X bar()

{

X x1;
// 处理 x1..
return x1;

}

编译器实现:

// 函数实现

void bar(X& __result) // 加上一个额外参数

{

// 预留x1的内存空间
X x1;
// 编译器产生的默认构造函数的调用,
x1.X::X();
// 处理 x1..
// 编译器产生的拷贝操作
__result.X::X(x1);
return;

}

// 函数调用

X x2; // 这里只是预留内存,并未调用初始化函数

bar(x2);

NRV优化后:

void bar(X& __result)

{

// 调用__result的默认构造函数
__result.X::X();
// 处理__result
return;

}

3、循环内变量优化:

void test2(char *s);

void test()

{

int i;

for (i = 0; i < 10; i ++) {

char buf[256];
test2(buf); //调用test2是为了让编译器认为buf有用,以免被优化掉

}

}

汇编代码:

movl $10, %ebx

subl $272, %esp #分配272字节栈空间

leal -264(%ebp), %esi #取buf地址

.L2:

movl %esi, (%esp) #buf地址入栈

call test2 #调用test2

subl $1, %ebx

jne .L2 #循环未结束则跳到L2

该函数中,buf不会每次循环都生成,而是循环外生成,循环内不断的使用。

4、算数式优化

a*2被编译成a+a;无符号数a/2被编译成a>>1;有符号数a/2。

5、memset函数优化

memset函数常用来初始化大段内存,但对小数据来说memset能否保持足够高效呢?

看这段程序:

编译成汇编:

movl $0, -24(%ebp) #设置s1

movl $0, -20(%ebp)

movl $0, -16(%ebp)

movl $0, -12(%ebp)

call test2 #调用test2

leal -8216(%ebp), %edx #设置s2

xorl %eax, %eax

movl %edx, %edi

movl $2048, %ecx

rep stosl

movl %edx, (%esp) #调用test2

call test2

movl %ebx, (%esp) #设置s3

movl $8193, 8(%esp)

movl $0, 4(%esp)

call memset

movl %ebx, (%esp) #调用test2

call test2

当数据长度比较小时(如s1是16字节),memset被编译成连续的赋值语句;当数据长度不大于8KB时(如s2),memset用串操作指令来实现;当数据长度大于8KB时(如s3),memset被编译成函数调用。

串操作类指令:在内存一个存储区域连续存放着若干个字节(或字)数据,这样一组数据称为“数据串”(高级语言视为数组)。若每个数据是一个字节,称“字节串”;若是字,则称“字串”。串操作指令可以用来实现内存区域的数据串操作。串操作指令每次只处理数据串中的一个数据,但与重复前缀配合使用(重复前缀+串操作指令),则可使操作重复进行(其执行过程相当于一个循环程序的运行,重复次数由寄存器CX决定)。


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Computer Age Statistical Inference

Computer Age Statistical Inference

Bradley Efron、Trevor Hastie / Cambridge University Press / 2016-7-21 / USD 74.99

The twenty-first century has seen a breathtaking expansion of statistical methodology, both in scope and in influence. 'Big data', 'data science', and 'machine learning' have become familiar terms in ......一起来看看 《Computer Age Statistical Inference》 这本书的介绍吧!

HTML 压缩/解压工具
HTML 压缩/解压工具

在线压缩/解压 HTML 代码

UNIX 时间戳转换
UNIX 时间戳转换

UNIX 时间戳转换

RGB CMYK 转换工具
RGB CMYK 转换工具

RGB CMYK 互转工具