小编Bol*_*oll的帖子

限制指针和内联

我试过使用限制合格的指针,我遇到了一个问题.下面的程序只是一个简单的程序,只是为了解决问题.

calc_function使用三个指针,这些指针受到限制,因此它们"SHALL"不会相互别名.在visual studio中编译此代码时,该函数将被内联,因此Visual Studio 2010无缘无故忽略限定符.如果我禁用内联,代码执行速度会快6倍(从2200ms到360ms).但是我不想在整个项目中禁用内联,也不想在整个文件中禁用内联(因为那时它会调用例如所有getter和setter中的开销,这将是可怕的).

(可能唯一的解决方案是禁用内联功能吗?)

我试图在函数中创建临时限制限定指针,在顶部和内部循环中试图告诉编译器我保证没有别名,但编译器不会相信我,它不会工作.我也尝试调整编译器设置,但我发现唯一有效的是禁用内联.

我很感激帮助解决这个优化问题.

要运行程序(在realeasemode中),请不要忘记使用参数0 1000 2000.为什么使用userinput/program参数是为了确保编译器无法知道指针之间是否存在别名a,b和c.

#include <cstdlib>
#include <cstdio>
#include <ctime>

// Data-table where a,b,c will point into, so the compiler cant know if they alias.
const size_t listSize = 10000;
int data[listSize];

//void calc_function(int * a, int * b, int * c){
void calc_function(int *__restrict a, int *__restrict b, int *__restrict c){
    for(size_t y=0; y<1000*1000; ++y){  // <- Extra loop to be able to messure the time.
        for(size_t i=0; i<1000; ++i){
            *a += …
Run Code Online (Sandbox Code Playgroud)

c++ optimization visual-studio-2010 restrict-qualifier

6
推荐指数
1
解决办法
1042
查看次数