c语言restrict,一个c语言关键字restrict例子的疑问

本文探讨了C语言中的restrict关键字如何帮助编译器进行优化。通过对比使用restrict前后生成的汇编代码,展示了restrict如何避免数据冲突,提高执行效率。在开启-O1优化级别下,使用restrict的函数在执行时减少了对内存的重复读取,从而提升了性能。

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

你对于restrict的理解是对的,只是楼主忽略了一件事情,这个关键字本身是用来帮助编译器优化代码的

怎么样优化呢,是告诉编译器,对于这个指针指向的值来讲,我只用这个指针修改,不会通过其他的指针修改,但是你的代码存在undefined behavior

如果没有生成楼主期望的代码,可以试着开启小幅度的编译器优化(比如对于gcc 开一个-O1汇编代码就会产生明显的变化)

下面的代码是在gcc 4.8.3开启-O1的情况下生成的,代码区别就是 有没有 restrict关键字

// void updatePtrs(size_t *restrict ptrA, size_t *restrict ptrB, size_t *restrict val)

updatePtrs:

.LFB3:

.cfi_startproc

movl 4(%esp), %ecx

movl 8(%esp), %eax

movl 12(%esp), %edx //将各地址存在寄存器

movl (%edx), %edx //将*val存到 %edx备用,这是唯一的一次加载,以下用的都是*val的这个副本

addl %edx, (%ecx)

addl %edx, (%eax)

ret

.cfi_endproc

.LFE3:

.size updatePtrs, .-updatePtrs

.globl updatePtr

.type updatePtr, @function

// void updatePtr(size_t * ptrA, size_t * ptrB, size_t * val)

updatePtr:

.LFB4:

.cfi_startproc

pushl %ebx

.cfi_def_cfa_offset 8

.cfi_offset 3, -8

movl 8(%esp), %ecx

movl 12(%esp), %eax

movl 16(%esp), %edx // 将各地址存在寄存器

movl (%edx), %ebx // 获取*val 存到%ebx备用

addl %ebx, (%ecx) // 这里

movl (%edx), %edx // 再次 获取*val 存到%edx备用

addl %edx, (%eax) // 这里; 都是从val的原始地址现取的值

popl %ebx

.cfi_restore 3

.cfi_def_cfa_offset 4

ret

.cfi_endproc

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值