首页
社区
课程
招聘
[求助]如何让结构体中的某个变量对齐到16字节?
发表于: 2014-7-14 12:22 7471

[求助]如何让结构体中的某个变量对齐到16字节?

2014-7-14 12:22
7471
我有个结构

int x
.....

BYTE Buffer[1024]

如上,我必须Buffer这个对齐到16字节,但因结构很大,前面有很多东西,又不想每个成员变量都对齐到16,只要Buffer对齐到16就可以了,不知道该怎么写?还有,该结构会被很多地方用到,所以也不希望改使用者的代码,只要改下结构定义是否能做到?

反正:
_declspec (align(16)) BYTE Buffer[1024]
和#pragma pack(16) BYTE Buffer[1024]
都无效果

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 0
支持
分享
最新回复 (7)
雪    币: 7048
活跃值: (3527)
能力值: ( LV12,RANK:340 )
在线值:
发帖
回帖
粉丝
2
你试试
#pragma pack(push,16)
struct _TEST
{
   int  a; 
};
#pragma pack(pop)

{
int x
...
_TEST test;
BYTE Buffer[1024]
}


要么你就直接取Buffer的指针,看距离16字节偏移差多少,差多少你在前面拿东西填充就行了
2014-7-14 12:34
0
雪    币: 174
活跃值: (620)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
3
[QUOTE=bxc;1300773]你试试
#pragma pack(push,16)
struct _TEST
{
   int  a;
};
#pragma pack(pop)

{
int x
...
_TEST test;
BYTE Buffer[1024]
}

要么你就直接取Buffer的指针,看距离16字节偏移差多少,...[/QUOTE]

谢谢
_TEST test;这个表示无效,刚在vs里测试过了,无法实现对齐到16
你说的差多少对齐,我也试过,因为该结构被许多地方使用,局部变量、类成员变量等等,无法保证对齐,因为它们第一个元素是以4对齐的
16可以被分成4种4对齐的方式
2014-7-14 13:25
0
雪    币: 7048
活跃值: (3527)
能力值: ( LV12,RANK:340 )
在线值:
发帖
回帖
粉丝
4
我的意思是&Buffer[0],比如是0x00403008。
0x00403008 % 0x10 = 8,
16 - 8 = 8。
那就在Buffer前插入两个int占位。
如果差距是按字节算的话,可以#pragma pack(1),再插入byte
2014-7-14 13:39
0
雪    币: 7048
活跃值: (3527)
能力值: ( LV12,RANK:340 )
在线值:
发帖
回帖
粉丝
5
我好像理解你说的意思了。
你要的不是Buffer在结构中的16字节对齐,而是在内存中的16字节边界对齐。
那这样的话,#pragma pack什么的就没用了。因为结构体的子成员在结构中偏移在编译时就已经确定了。
想要内存中的16字节边界对齐的话,这个得看结构的开始地址是按几DWORD对齐的了。
在栈上的结构或许还能简单搞定,但如果是在堆上开辟空间的话。
其申请的内存地址不知道是按几DWORD对齐的,所以要达到目的,Buffer成员在结构中的偏移也不固定。
(也就是说想靠编译器给你解决的话,基本没戏)
以下是个人拙见:
typedef struct _MyStruct
{
  int x;
  ...
  uint idx;
  BYTE Byffer[15 + 1024];  //15字节用于动态调整
} MyStruct, *PMyStruct;


如果Byffer的绝对地址是0x00403004。
UINT i;
i = 0x00403004 % 0x10;

if (i)
  idx = 16 - i;
else
  idx = 0;

这样Buffer数组的实际第一个成员就是Byffer[idx];
2014-7-14 14:06
0
雪    币: 174
活跃值: (620)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
6
对,我的意思就是在内存中以16对齐,因为sse需要用到
不过一楼我的测试方法可能是编译不对还是怎么了,后来全工程重新编译,经测试,
_declspec (align(16)) BYTE pBuffer[1024];

又是能对齐的,呵呵,奇怪,你也可以试试,说不定需要的时候用得上
2014-7-14 14:19
0
雪    币: 388
活跃值: (707)
能力值: ( LV9,RANK:170 )
在线值:
发帖
回帖
粉丝
7
看前面的结构,自己在buffer前面用char的数组占一下位就好了!保证buffer对齐到16字节!
2014-7-14 17:44
0
雪    币: 174
活跃值: (620)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
8
如果结构起始位置没有对齐到16字节呢?是吧,特别是在栈里面的时候,你就无法保证buffer一定对齐到16字节了
2014-7-25 13:38
0
游客
登录 | 注册 方可回帖
返回
//