在C中,编译器将按照声明它们的顺序布置结构的成员,在成员之间插入可能的填充字节,或者在最后一个成员之后插入,以确保每个成员正确对齐.
gcc提供了一种语言扩展,__attribute__((packed))它告诉编译器不要插入填充,允许结构成员不对齐.例如,如果系统通常要求所有int对象都具有4字节对齐,则__attribute__((packed))可能导致int在奇数偏移处分配struct成员.
引用gcc文档:
`packed'属性指定变量或结构字段应该具有尽可能小的对齐 - 变量的一个字节和字段的一个位,除非您使用`aligned'属性指定更大的值.
显然,使用此扩展可以导致更小的数据要求但代码更慢,因为编译器必须(在某些平台上)生成代码,以便一次一个字节地访问未对齐的成员.
但有任何不安全的情况吗?编译器是否始终生成正确(但速度较慢)的代码来访问打包结构的未对齐成员?在所有情况下都可以这样做吗?
并行化的一种常见技术是融合嵌套for循环
for(int i=0; i<n; i++) {
for(int j=0; j<n; j++) {
Run Code Online (Sandbox Code Playgroud)
至
for(int x=0; x<n*n; x++) {
int i = x/n; int j = x%n;
Run Code Online (Sandbox Code Playgroud)
我想知道我怎么能这样做融合像这样的三角形循环
for(int i=0; i<n; i++) {
for(int j=0; j<i+1; j++) {
Run Code Online (Sandbox Code Playgroud)
这有n*(n+1)/2迭代.让我们调用融合迭代x.使用二次方程式我得出了这个:
for(int x=0; x<(n*(n+1)/2); x++) {
int i = (-1 + sqrt(1.0+8.0*x))/2;
int j = x - i*(i+1)/2;
Run Code Online (Sandbox Code Playgroud)
与融合方形循环不同,这需要使用sqrt从int到float以及从float到int 的函数和转换.
我想知道是否有更简单或更有效的方法吗?例如,一个解决方案,它不需要sqrt从int到float或float到int 的函数或转换.
编辑:我不想要一个依赖于前一次或下一次迭代的解决方案. 我只想要像int这样的解决方案i = funci(x) and int j = funcj(x,i)
这是一些代码显示这是有效的:
#include <stdio.h>
#include …Run Code Online (Sandbox Code Playgroud)