ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

c – 混淆数据地址对齐

2019-08-24 00:09:01  阅读:163  来源: 互联网

标签:c-3 c memory-alignment


我对提供的答案有疑问

@ dan04. What is aligned memory allocation?

特别是,如果我有这样的事情:

int main(){
      int num;  // 4byte
      char s;   // 1byte
      int *ptr;


}

如果我有一台32位机器,你认为默认情况下它仍会填充数据吗?

在上一个问题中,有人问过struct,我问的是在main中声明的变量.

更新:

a = 2 bytes 
b = 4 bytes
c = 1 byte
d = 1 byte



 0 1 2 3 4 5 6 7
|a|a|b|b|b|b|c|d|  bytes
|       |       |  words

解决方法:

对此没有规定.这取决于您使用的实现.此外,它可能会根据编译器选项而改变.您可以做的最好是打印每个变量的地址.然后你可以看到内存布局是怎样的.

像这样的东西:

int main(void)
{
  int num; 
  char s;   
  int *ptr;

  printf("num: %p - size %zu\n", (void*)&num, sizeof num);
  printf("s  : %p - size %zu\n", (void*)&s, sizeof s);
  printf("ptr: %p - size %zu\n", (void*)&ptr, sizeof ptr);

  return 0;
}

可能的输出:

num: 0x7ffee97fce84 - size 4
s  : 0x7ffee97fce83 - size 1
ptr: 0x7ffee97fce88 - size 8

另请注意,如果您没有获取变量的地址(&),编译器可能会优化您的代码,以便变量永远不会被放入内存中.

通常,通常进行对齐以从所使用的HW平台获得最佳性能.这通常意味着变量与其大小对齐,或者对于大小大于4的变量至少4字节对齐.

更新:

OP在更新中给出了一个特定的布局示例,并询问是否可以/将要发生该布局.

答案是:它依赖于实现

所以原则上它可能发生在某个特定的系统上.这就是说我怀疑它会在任何主流系统上发生.

还有另一个用gcc -O3编译的代码示例

int main(void)
{
  short s1;
  int i1;
  char c1;
  int i2;
  char c2;


  printf("s1: %p - size %zu\n", (void*)&s1, sizeof s1);
  printf("i1: %p - size %zu\n", (void*)&i1, sizeof i1);
  printf("c1: %p - size %zu\n", (void*)&c1, sizeof c1);
  printf("i2: %p - size %zu\n", (void*)&i2, sizeof i2);
  printf("c2: %p - size %zu\n", (void*)&c2, sizeof c2);

  return 0;
}

我的系统输出:

s1: 0x7ffd222fc146 - size 2   <-- 2 byte aligned
i1: 0x7ffd222fc148 - size 4   <-- 4 byte aligned
c1: 0x7ffd222fc144 - size 1
i2: 0x7ffd222fc14c - size 4   <-- 4 byte aligned
c2: 0x7ffd222fc145 - size 1

请注意内存中的位置与代码中定义的顺序变量的不同之处.这确保了良好的对齐.

按地址排序:

c1: 0x7ffd222fc144 - size 1
c2: 0x7ffd222fc145 - size 1
s1: 0x7ffd222fc146 - size 2   <-- 2 byte aligned
i1: 0x7ffd222fc148 - size 4   <-- 4 byte aligned
i2: 0x7ffd222fc14c - size 4   <-- 4 byte aligned

所以再次回答更新问题:

在大多数系统上,我怀疑你会看到一个4字节变量放在地址xxx2,xxx6或xxxa,xxxe.但是,系统可能存在于可能发生的地方.

标签:c-3,c,memory-alignment
来源: https://codeday.me/bug/20190823/1702362.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有