相关疑难解决方法(0)

gcc的__attribute __((打包))/ #pragma包不安全吗?

在C中,编译器将按照声明它们的顺序布置结构的成员,在成员之间插入可能的填充字节,或者在最后一个成员之后插入,以确保每个成员正确对齐.

gcc提供了一种语言扩展,__attribute__((packed))它告诉编译器不要插入填充,允许结构成员不对齐.例如,如果系统通常要求所有int对象都具有4字节对齐,则__attribute__((packed))可能导致int在奇数偏移处分配struct成员.

引用gcc文档:

`packed'属性指定变量或结构字段应该具有尽可能小的对齐 - 变量的一个字节和字段的一个位,除非您使用`aligned'属性指定更大的值.

显然,使用此扩展可以导致更小的数据要求但代码更慢,因为编译器必须(在某些平台上)生成代码,以便一次一个字节地访问未对齐的成员.

但有任何不安全的情况吗?编译器是否始终生成正确(但速度较慢)的代码来访问打包结构的未对齐成员?在所有情况下都可以这样做吗?

c gcc pragma-pack

149
推荐指数
4
解决办法
11万
查看次数

融合三角形循环进行并行化,计算子索引

并行化的一种常见技术是融合嵌套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)

c c++ math for-loop

7
推荐指数
1
解决办法
1743
查看次数

标签 统计

c ×2

c++ ×1

for-loop ×1

gcc ×1

math ×1

pragma-pack ×1