3474|9

80

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

高手进,#pragma pack(n)是否能用在数组的定义上?谢谢 [复制链接]

一个数组,成员的结构体里含有2BYTE宽字符,赋值是CONST常量。
编译出来这些字符的地址,有时候是奇,有时候是偶数。

而平台默认是1字节对齐的,平台上的宽字符处理函数,却必须从偶数地址开始操作,否则得到的结果会偏移1个字节。

是否可以在数组的声明和初始化代码段里用#pragma pack(n)来强制数据地址是2,或4字节对齐的?

如果不行,有没有其他办法,谢谢。

最新回复

看一下我的这篇文章,看看是否有用 http://blog.eeworld.net/xcgspring/archive/2010/02/02/5279677.aspx   详情 回复 发表于 2010-2-2 15:06
点赞 关注

回复
举报

71

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
自己顶。。。。
 
 

回复

76

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
定义结构体的时候我试了一下倒是可以,直接声明数组的时候好像不行

这个你可以改一下你的内存分配函数,提供一个2字节对齐的分配函数
 
 
 

回复

84

帖子

0

TA的资源

一粒金砂(初级)

4
 
#pragma pack(2) 应该可以 记不清了 没试
不过建议把编译缺省设成4字节对齐 只对要pack的结构进行pack
这样,如果你的数组是在全局,则受这个pragma控制,局部变量在堆栈上,编译器处理的不好
但是有个办法可以试一下,就是把数组定义在一个结构里面。。。
如果你用gcc的话,则局部变量页可以使用__attribute__(aligned(4))来4对齐
 
 
 

回复

79

帖子

0

TA的资源

一粒金砂(初级)

5
 
引用 3 楼 toborac 的回复:
#pragma pack(2) 应该可以 记不清了 没试
不过建议把编译缺省设成4字节对齐 只对要pack的结构进行pack
这样,如果你的数组是在全局,则受这个pragma控制,局部变量在堆栈上,编译器处理的不好
但是有个办法可以试一下,就是把数组定义在一个结构里面。。。
如果你用gcc的话,则局部变量页可以使用__attribute__(aligned(4))来4对齐


也可以,LZ可以试试,把编译器设为4
 
 
 

回复

69

帖子

0

TA的资源

一粒金砂(初级)

6
 
To All,
    感谢大家,我会按照大家的做法试一下,虽然我分不多,但是如果成功了,一定会尽量多的给大家分的。

 
 
 

回复

45

帖子

0

TA的资源

一粒金砂(初级)

7
 
引用 3 楼 toborac 的回复:
#pragma pack(2) 应该可以 记不清了 没试
不过建议把编译缺省设成4字节对齐 只对要pack的结构进行pack
这样,如果你的数组是在全局,则受这个pragma控制,局部变量在堆栈上,编译器处理的不好
但是有个办法可以试一下,就是把数组定义在一个结构里面。。。
如果你用gcc的话,则局部变量页可以使用__attribute__(aligned(4))来4对齐


PRAGMA试了,还是不行,看来PRAGMA只能针对结构体定义。
我的数组是全局,如果缺省设置为4字节对齐,对整个工程的影响太大,估计要被砍死。
我用的是Q公司的B平台,WSTRCPY超级SB啊!!!
 
 
 

回复

85

帖子

0

TA的资源

一粒金砂(初级)

8
 
#if defined(__ICC) || defined(__SUNPRO_C)

    #define DECLARE_ALIGNED(n,t,v)      t v __attribute__ ((aligned (n)))

    #define DECLARE_ASM_CONST(n,t,v)    const t __attribute__ ((aligned (n))) v

#elif defined(__GNUC__)

    #define DECLARE_ALIGNED(n,t,v)      t v __attribute__ ((aligned (n)))

    #define DECLARE_ASM_CONST(n,t,v)    static const t v attribute_used __attribute__ ((aligned (n)))

#elif defined(_MSC_VER)

    #define DECLARE_ALIGNED(n,t,v)      __declspec(align(n)) t v

    #define DECLARE_ASM_CONST(n,t,v)    __declspec(align(n)) static const t v

#else

    #define DECLARE_ALIGNED(n,t,v)      t v

    #define DECLARE_ASM_CONST(n,t,v)    static const t v

#endif
试试这个吧,从ffmpeg中摘的,里面用于声明数组对齐的。
 
 
 

回复

64

帖子

0

TA的资源

一粒金砂(初级)

9
 
不过好像只对数组的首地址有用……
 
 
 

回复

88

帖子

0

TA的资源

一粒金砂(初级)

10
 
看一下我的这篇文章,看看是否有用
http://blog.eeworld.net/xcgspring/archive/2010/02/02/5279677.aspx
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/7 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表