聚星亭

吾笨笨且懒散兮 急须改之而奋进
posts - 74, comments - 166, trackbacks - 0, articles - 0
  C++博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

[转载]C/C++技术细节(VC编译器)

Posted on 2009-03-30 17:09 besterChen 阅读(473) 评论(0)  编辑 收藏 引用 所属分类: C/C++/STL/boost
以下内容引用与 Pediy.com
1.Jmp stub Function
        考虑以下函数:
                Void Test(){}
                Void main()
                { test();}
        在debug情况下,编译后
                Void Jmp_Test()
                {
                            Jmp to Real_test();
                }
                Void main()
                {jmp_test()}
如何让编译器不产生Jmp Stub function。
解决方法,在Link选项中去掉Increment link.

2.自定义节,数据代码合并在一个节
        #pragma data_seg(".mydat") //指定该.cpp/.c(其实应该是某个.obj文件) 数据存放的节

注意:        Dword a; //  未初始化,数据仍保存在.data节
                    Dword a=0; //这样a就保存到.mydat节了

        #pragma code_seg(".shell")//指定该.cpp/.c(其实应该是某个.obj文件) 代码存放的节
        #pragma comment(linker,"/SECTION:.mydat,RWE") //修改节属性
        #pragma comment(linker,"/SECTION:.shell,RWE")
        #pragma comment(linker,"/MERGE:.mydat=.shell")//两节合并到.shell节

3.__declspec(naked)声明的函数不能使用局部变量

4.char[]
char test[]=”test”//假定 此处地址为0x4001000
void main()
{
    printf(“%x”,test);
    printf(“%x”,&test);
}//执行以上代码分别输出什么
答案:两个都输出0x4001000,哈哈,没想到吧。

5.char*与char[]
char* test1=”test”;
char test2[]=”test”
考虑下执行该程序会产生什么状况
void main()
{
    test1=”new test”;
    test2=”new test”;
}
考虑下再看答案





编译后是这样的。
atest db ‘test’,0
Test1  dd  offset of attest
Test2 db ‘test’,0
所以test2=”new test”;编译过不了,当然我们仍然能够通过memcpy给test2赋值

6.数据对齐
Word a;
Char str[]=”ddddd”;
Void main()
{
  Printf(”%d”,&str-&a);//输出什么,考虑一下
}
答案:可能输出2,也可能输出4

以后我会自己总结一些贴过来的!

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   博问   Chat2DB   管理