- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
所有,我有一个关于 C 中数组的内存对齐的有趣问题。我的操作系统是 32 位 Ubuntu,我使用 gcc -S -fno-stack-protector 选项编译它。
代码:
char array1[5] = "aaaaa";
char array2[8];
array2[0] = 'b';
pushl %ebp
move %esp, %ebp. # esp and ebp are pointing to the same words
subl $16, %esp # move esp to lower 16
movl $1633771873, -5(%ebp) # input "aaaa"
movb $97, -1(%ebp). # input 'a'
movb $98, -13(%ebp) # input 'b'
movl $0, %eax
leave
%ebp
是
efe8
,
%esp
是
efd8
,
&buf1
是
efe3
,
&buf2
是
efdb
.
x/4bd 0xbfffefd8
, 表明
0xbfffefd8: 9 -124 4 98
0xbfffefd8: 9
0xbfffefd8: 98
## high address ##
? efe8 <-- ebb
97 97 97 97 efe4
0 -80 -5 97(a) efe0
0 0 0 0 efdc
9 -124 4 98(b) efd8 <-- esp
^ ^
| |
efd8 efdb
efdb
, 而 %esp
是 efd8
?我认为 'b' 也应该在 efd8
,因为它是 4 字节字的开始。此外,如果我继续向 buf2
填充更多“b”从 efdb
开始,它只能填5'b',不能填8。怎么会? '\0' 呢? buf1
, 从
efe3
开始,不是
efe0
.这是一种什么样的对齐方式?这对我来说没有意义。
andl $-16, %esp # this aligns esp to 16 boundary
char[5]
不被解释为考虑内存对齐的方式。那么内存对齐应该发生在运行时。我对吗?但是 GDB 调试显示与汇编代码完全相同。根本没有对齐。
最佳答案
我看这里没有任何问题。 TLDR 答案:char 数组对齐到 1 个字节 ,编译器是对的。
再挖一点。在我的 64 位机器上,使用带有 -m32 选项的 GCC 7,我运行和调试了相同的代码,我得到了相同的结果:
(gdb) x/4bd $esp+12
0xffffcdd4: 97 97 97 97
(gdb) x/4bd $esp+8
0xffffcdd0: 0 -48 -7 97
(gdb) x/4bd $esp+4
0xffffcdcc: 0 0 0 0
(gdb) x/4bd $esp+0
0xffffcdc8: 41 85 85 98
$esp
, 以 4 字节对齐,正如预期的那样:
(gdb) p $esp
$9 = (void *) 0xffffcdc8
array1[5]
并将其放在堆栈上,但由于它是 5 个字节宽,因此将其扩展为第二个双字。因此,第一个 dword 充满了“a”,而仅使用了第二个 dword 的 1 个字节。现在,
array2[8]
紧随其后(或之前,取决于您的外观)
array1[5]
.它在 3 个双字上扩展,以
$esp
指向的双字结尾.
[esp + 0] <3 bytes of garbage /* no var */>, 'b' /* array2 */,
[esp + 4] 0x0, 0x0, 0x0, 0x0, /* still array2 */
[esp + 8] <3 bytes of garbage /* still array2 */>, 'a' /* array1 */,
[esp + 12] 'a', 'a', 'a', 'a', /* still array1 */.
char[2]
array2
之后的数组您将使用
$esp
指向的相同双字看到它并且仍然有来自
$esp
的 1 个字节的垃圾给您的
array3[2]
.
char
数组要以 4 字节对齐(但您需要一个很好的理由!),您必须使用特殊的编译器属性,例如:
__attribute__ ((aligned(4)))
关于C语言 : how memory alignment happened in the stack for array,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59865199/
我试图找出在表格单元格上放置对齐属性与使用 text-align css 属性之间的区别。下面的代码显示了 IE 与其他浏览器中的不同结果。在 IE 中,对齐最终会对齐每个子子项,因此文本“test”
我正在 summernote HTML 编辑器上做一些 POC,我正在使用自定义工具栏,但我不知道如何添加对齐(左对齐、居中对齐、右对齐)工具栏,所以有人可以帮助我实现这一目标。 还有人可以帮我找到更
以下是从节对齐转换为文件对齐的步骤: 找到数据的 RVA 从 RVA 导出引用的数据所属的部分。这是微不足道的,因为部分不重叠。文件头中提供了各个部分的起始地址。 找出RVA和section的起始地址
align-self 在以下代码中, align-self 与 flex-wrap: nowrap 一起使用。 flex-container { display: flex; flex-wra
这是CSS: .divPhoto { border:1px solid #999; width:140px; height:140px; border-radius:3
我正在为 Windows Phone 8 开发,我已经设计了我的应用程序,我注意到有一个“分配网格”代码,默认情况下可以在新项目中取消注释。 看看下面的文件中的描述: --> 这是取
我们有浏览器前缀或黑客 (for Google and Safari) text-align: -webkit-right; (for Firefox) text-align:
最近我观察到,在 Clang 9.0 上 alignof 和 __alignof 为 unsigned long long 返回不同的值,并且在 https://reviews.llvm.org/D5
我已经一年多没有为 Android 开发了,我对它有点生疏了。我正在尝试设置一个有点简单的 UI:屏幕底部的底部栏和它上面的 fragment (但没有填充整个高度)。像这样: 我认为这会很简单,但经
你好,我正在尝试找到一种使用“讨厌的”align=center 技巧的方法.. 嗯,当我查看一些代码时,我注意到两个非常相似的片段呈现的并不相同。我找不到让他们表现相同的方法。这包括用 div 替换顶
抱歉这个愚蠢的问题。我只想知道我们什么时候讨论内存中的数据应该如何对齐之类的。这个主题是叫“内存对齐”还是“数据对齐”,还是我可以随便叫它什么? 最佳答案 在编程的上下文中,它被称为 data str
所以我只是想制作一个简单的导航栏,并且我刚开始使用 flexbox。为什么 align-content 在这里不起作用?我可以让 justify-content 工作,但我就是无法垂直对齐。这是代码。
我从这个 SO 开始答案,我试图使用提供的纯 flexbox 答案。 然而,当我尝试这个时,我看到了以下结果。 我不确定为什么 Button 4 在行中出现的位置高于其余元素。 HTML
我已通读 A complete guide to Grid ,但仍然对两组容器属性之间的差异感到困惑,即“justify/align-items”与“justify/align-content”。 我
我有一个simple plunker here. .container { display:flex; flex-flow: row nowrap; justify-content: sp
从 http://code.google.com/p/berkeleyaligner/ 下载主干代码后,我将该项目添加到 Eclipse 上的构建路径中。然后,使用下面的代码,我可以提取从 sourc
这个问题在这里已经有了答案: What's the difference between align-content and align-items? (15 个答案) 关闭 7 年前。 我发现 C
[short text][image1][image2]____________________________________ [this is a reallyyyyyyy............
我有一个很小的菜单列表,当鼠标靠近时它应该会增长。在其原始状态下,菜单是右对齐的,悬停时每第二个元素向右移动并左对齐以为增加的高度腾出空间(参见 JSFiddle )。 ul { font-siz
这个问题在这里已经有了答案: Align child elements of different blocks (3 个答案) 关闭 3 年前。
我是一名优秀的程序员,十分优秀!