c++ - 汇编代码中的引用/指针

标签 c++ assembly reference x86 g++

我想看看按引用调用与 C++ 中的按指针调用有何不同。
但是,g++ 编译器(使用 -O0 -S)生成相同的代码。
我尝试使用各种人为构造来“欺骗”编译器以产生某种差异,但它似乎比我聪明。
有没有办法关闭 gcc 中的所有智能,以便我可以理解汇编中引用的实现?

[编辑]

/* Testing assembly representation of ref/pointer/by-value parameters */

int byRef(int &value, int value2) {
    value = value2;
    return value;
}

int byPtr(int * value, int value2) {
    *value = value2;
    return *value;
}


int main(int argc, char * argv[]) {
    int value = 5;
    byRef(value, value);
    byPtr(&value, value);
}


call    ___main
movl    $5, -4(%ebp)
movl    -4(%ebp), %eax
movl    %eax, 4(%esp)
leal    -4(%ebp), %eax
movl    %eax, (%esp)
call    __Z5byRefRii
movl    -4(%ebp), %eax
movl    %eax, 4(%esp)
leal    -4(%ebp), %eax
movl    %eax, (%esp)
call    __Z5byPtrPii
movl    $0, %eax

这里也没有区别..有没有简单的方法来触发语义重用?

最佳答案

真的,没有太多需要了解的了。

引用指针,引用不是指针。

更准确地说,引用当然根本不是指针,它们是别名。这意味着在语义上,它们是相同的变量,只是名称不同。这意味着编译器通常可以使用巧妙的重命名技巧来完全优化引用传递。

有时,它仍然必须以某种方式传递引用,然后这通常通过指针发生(这不是必需的,但恰好是一种适合的技术)。在幕后,与指针的唯一可观察到的区别是引用不能为 null,编译器知道这一点(但是,如果你足够恶意,你可以创建一个 null 引用).

关于c++ - 汇编代码中的引用/指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6954742/

相关文章:

c++ - 从文件中读取 C++

gcc - 为什么我的 gcc 输出中有额外的指令?

linux - 如何运行在 Cool 编译器中生成的中间文件,如 x86 汇编文件

c++ - 通过 C++ 中的指针列表分配数据

c++ - 从函数返回的对象的延长生命周期

c++ - 文件 I/O 与 TCP 套接字,同一机器内数据传输哪个更快?

c++ - CodeChef 上的时间限制错误

c++ - R 中的 LoadLibrary 失败 : %1 is not a valid Win32 application.

c++:使用存储在数组中的各种参数调用函数?

reference - 为什么我可以返回对局部文字的引用而不是变量?