1
3
对于第一个问题,“是”,如果您同时使用这两个选项,则意味着不同的内容。
对于第二个问题,“是”,它假定通过行指针访问的任何内容都只能通过行指针访问。
你可以投掷
最后,如果这是gcc at-o2、-o3或-os,编译器已经在基于类型执行别名分析。我相信其他编译器也会这样做。这意味着对指针和整数的限制已经被理解,只留下可能相互存储的数组。 总之,优化器将假定指针没有存储在ints中,并且它知道在循环期间它没有进行任何指针写入。 因此,您可能只需要一个限制就可以得到相同的代码。 |
2
2
外部(第二个)限制告诉编译器没有指针数组(A、B和out)别名。内部(第一个)限制告诉编译器没有一个int数组(由指针数组的元素指向)别名。 如果您同时访问[0][col*nrows+row]和[col][row],那么您违反了内部限制,因此事情可能会中断。 |
3
2
类推
我不知道你的编译器是否真的会用这些知识做任何事情,记住。很明显,这是一个是否实施的问题。
所以我真的不知道你在传统的C 2-D阵列上得到了什么,你只需要分配
乍一看,乘法可能比其他指针间接法更快。显然,您关心性能,或者根本不会使用restrict,所以为了稍微好一点的语法,在进行此更改之前,我会相当仔细地测试性能(在您关心的所有编译器上),而不必记住每次访问数组时有多少列。 通过[0][col*nrows+row]访问元素是否未定义? 是的,如果某个访问修改了元素,因为这使得[0]成为内存别名,也可以通过[col]访问。如果只有A和B是限定的指针,那就好了,但是如果A[0]和A[col]是限定的指针,那就不行了。 我假设在这个函数中不修改,所以实际上别名是可以的。但是,如果您在out中做同样的事情,那么行为将是未定义的。 |
Community wiki · C中有哪些耗时的操作? 1 年前 |
Community wiki · 将所有处理器电源都投入到任务中 1 年前 |
Community wiki · C++为C添加了什么?[已关闭] 1 年前 |
Community wiki · 打印1到1000,不带循环或条件 1 年前 |