- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
这不是学术代码或假设性问题。最初的问题是将代码从 HP11 转换为 HP1123 Itanium。基本上归结为 HP1123 Itanium 上的编译错误。在 Windows 上复制它进行研究时,我真的很抓狂。除了最基本的方面,我已经删除了所有内容...如果按原样运行,您可能必须按 control D 退出控制台窗口:
#include "stdafx.h"
#include <iostream>
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
char blah[6];
const int IAMCONST = 3;
int *pTOCONST;
pTOCONST = (int *) &IAMCONST;
(*pTOCONST) = 7;
printf("IAMCONST %d \n",IAMCONST);
printf("WHATISPOINTEDAT %d \n",(*pTOCONST));
printf("Address of IAMCONST %x pTOCONST %x\n",&IAMCONST, (pTOCONST));
cin >> blah;
return 0;
}
这是输出
IAMCONST 3
WHATISPOINTEDAT 7
Address of IAMCONST 35f9f0 pTOCONST 35f9f0
我只能说这到底是怎么回事?这样做是不确定的吗?对于这样一个简单的例子,这是我见过的最违反直觉的事情。
更新:
确实在搜索了一段时间之后,菜单调试 >> Windows >> 反汇编具有如下所述的优化。
printf("IAMCONST %d \n",IAMCONST);
0024360E mov esi,esp
00243610 push 3
00243612 push offset string "IAMCONST %d \n" (2458D0h)
00243617 call dword ptr [__imp__printf (248338h)]
0024361D add esp,8
00243620 cmp esi,esp
00243622 call @ILT+325(__RTC_CheckEsp) (24114Ah)
谢谢大家!
最佳答案
看起来编译器正在优化
printf("IAMCONST %d \n",IAMCONST);
进入
printf("IAMCONST %d \n",3);
因为你说IAMCONST
是一个const int
。
但是由于您要获取 IAMCONST
的地址,它实际上必须位于堆栈中的某处,并且不能强制执行 const
ness,所以该位置的内存 (*pTOCONST
) 毕竟是可变的。
简而言之:您抛弃了 const
ness,不要那样做。可怜的,手无寸铁的 C...
使用 GCC for x86,-O0
(无优化),生成的程序集
main:
leal 4(%esp), %ecx
andl $-16, %esp
pushl -4(%ecx)
pushl %ebp
movl %esp, %ebp
pushl %ecx
subl $36, %esp
movl $3, -12(%ebp)
leal -12(%ebp), %eax
movl %eax, -8(%ebp)
movl -8(%ebp), %eax
movl $7, (%eax)
movl -12(%ebp), %eax
movl %eax, 4(%esp)
movl $.LC0, (%esp)
call printf
movl -8(%ebp), %eax
movl (%eax), %eax
movl %eax, 4(%esp)
movl $.LC1, (%esp)
call printf
从堆栈上的*(bp-12)
复制到printf
的参数。但是,使用 -O1
(以及 -Os
、-O2
、-O3
和其他优化级别),
main:
leal 4(%esp), %ecx
andl $-16, %esp
pushl -4(%ecx)
pushl %ebp
movl %esp, %ebp
pushl %ecx
subl $20, %esp
movl $3, 4(%esp)
movl $.LC0, (%esp)
call printf
movl $7, 4(%esp)
movl $.LC1, (%esp)
call printf
您可以清楚地看到使用了常量 3
。
如果您使用的是 Visual Studio 的 CL.EXE
,/Od
会禁用优化。这因编译器而异。
请注意,C 规范 allows C 编译器假设任何 int *
指针的目标永远不会与 const int
的内存位置重叠,所以如果你真的不应该这样做想要可预测的行为。
关于c++ - 邪恶的 Actor 会被邪恶的编译器击败吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/712334/
对于线程和计时器之类的东西,我无法忍受拖放控件。这些控件只是感觉与它们存在的实际本质相去甚远。拖放一个线程?我希望拖拽者在他们这样做之前了解幕后发生的事情。 这些抽象是否离金属太远了?他们是在帮助还是
有些人似乎认为 C 的 strcpy() 函数不好或邪恶。虽然我承认通常最好使用 strncpy() 来避免缓冲区溢出,但以下(strdup() 函数的实现对于那些不幸的人来说拥有它)安全地使用 st
我一直在用 matrix = *((fxMatrix*)&d3dMatrix); 好久不见。它工作正常,直到我的屏幕变黑并在我的办公 table 上收到一桶挫败感。 fxMatrix 包含 4 个 f
这是我应该问的问题,而不是这个: Emacs evil: space as a prefix key in motion state 我想定义一堆用于移动、移动、打开和关闭窗口和缓冲区的命令,这些命令
作为 Vim 用户,我在将近二十年后尝试 Emacs+Evil。我正在将我的大部分 Vim 配置移至 Evil,但我遇到很多问题的一件事是像我在 Vim 中使用的那样设置搜索和突出显示。我想要得到的是
很难说出这里问的是什么。这个问题模棱两可、含糊不清、不完整、过于宽泛或言辞激烈,无法以目前的形式合理回答。如需帮助澄清此问题以便可以重新打开,visit the help center . 9年前关闭
我是一名优秀的程序员,十分优秀!