引用如何在gcc中转换为asm
How does reference translates to asm in gcc?
引用是像通常的指针一样编译的,还是后面有其他东西?
它的叮当声有何不同?
您可以将引用视为一个不可变的指针,在使用时会自动取消引用。这不是C++标准所说的,所以你不能把它当作一个实际的实现。
但实际上,这可能是你在许多情况下看到的
在参数传递的情况下,以以下示例为例:
#include <stdio.h>
void function (int *const n){
printf("%d",*n);
}
void function (int & n){
printf("%d",n);
}
int main(){
int n = 123;
function(&n);
function(n);
}
gcc
和clang
为未启用任何优化的函数生成相同的代码:
function(int*):
push rbp
mov rbp, rsp
sub rsp, 16
mov QWORD PTR [rbp-8], rdi
mov rax, QWORD PTR [rbp-8]
mov eax, DWORD PTR [rax]
mov esi, eax
mov edi, OFFSET FLAT:.LC0
mov eax, 0
call printf
nop
leave
ret
function(int&):
push rbp
mov rbp, rsp
sub rsp, 16
mov QWORD PTR [rbp-8], rdi
mov rax, QWORD PTR [rbp-8]
mov eax, DWORD PTR [rax]
mov esi, eax
mov edi, OFFSET FLAT:.LC0
mov eax, 0
call printf
nop
leave
ret
引用如何在gcc中转换为asm?
一般来说:这取决于情况。
要在特定情况下找到答案,可以通过读取生成的程序集进行测试。
引用是像通常的指针一样编译的,还是后面有其他东西?
使用引用的代码实现实际上与使用指针实现相同间接寻址的代码实现完全相同。标准并不能保证如何实现每一个,但没有必要以不同的方式实现它们。
引用与指针的区别仅在于C++规则允许它们使用。当然,由于规则不同,指针的使用方式与引用不同。在这种情况下,您无法比较指针是否生成相同的程序集。
引用的限制可能会使一些优化变得更容易,因此可能会有所不同,但如果使用指针,这种优化也可能是,因此在使用引用而不是指针时,无法保证不同的程序集输出。
它在叮当声中有什么不同?
一般来说:这取决于情况。
两个编译器都受相同的标准规则约束。它们可能生成相同或不同的程序集。在引用的特定用例中,一个编译器的特定版本的生成程序集与另一个编译器特定版本生成的程序集有何不同(如果有的话),每个程序集都有特定的编译选项,在特定操作系统的特定处理器架构上,可以通过在每个特定情况下检查和比较生成的组件来找到。
相关文章:
- 防止主数据类型C++的隐式转换
- 模板参数替换失败,并且未完成隐式转换
- 努力将整数转换为链表。不知道我在这里做错了什么
- HEX值到wchar_t字符(UTF-8)的转换
- lambda参数转换为constexpr技巧,然后获取带链接的数组
- 将 Qvector<uint8_t> 转换为 QString
- 如何在cuSparse中使用cusparseXcoo2csr从coo转换为csc
- 有关插入适配器的错误。[错误]请求从 'back_insert_iterator<vector<>>' 类型转换为非标量类型
- 在c++中使用nlohmann从类到json的转换
- 从"int*"强制转换为"unsigned int"会丢失精度错误
- 将Integer转换为4字节的unsined字符矢量(按大端字节顺序)
- 尝试使用 x86 asm SSSE3 将大端转换为小端序
- 引用如何在gcc中转换为asm
- 将 AT&T 语法转换为英特尔语法 (ASM)
- 将内联ASM转换为X64 igraph的固有
- 高级到 ASM 转换
- 将浮点数组转换为整数的最佳方式.[替换x64的asm代码]
- 在数组的每个元素中存储一个值:将C do{}while循环转换为MIPS asm
- 如何将__asm块转换为基于字符串的asm(与g++兼容)
- 有人能帮助将此asm代码转换为x64版的c++吗