小编bki*_*ing的帖子

为什么绑定到三元组的const引用会复制?

我很困惑这个:

#include <iostream>
struct X {};
void f( const X &x ) { std::cerr << &x << "\n"; }

static X x;
int main()
{
  f( x ); // Off stack address
  f( false ? X() : x ); // Different address on stack.
}
Run Code Online (Sandbox Code Playgroud)

为什么f的第二次调用会产生临时副本?

编辑:这个问题不是关于类型X,而是复制的事实.我从接受的答案中忽略了值类别的过剩,并且期望f的参数直接绑定在x或X()上,就像将其重新表述为if语句一样.

c++

11
推荐指数
1
解决办法
590
查看次数

为什么 gcc 默认使用“-z now”链接,尽管惰性绑定是 ld 的默认设置?

man ld有以下话要说-z lazy:

...告诉动态链接器将函数调用解析推迟到调用函数时...延迟绑定是默认设置。

另一方面,gcc --verbose main.c传递-z now -z relro给 ld 以获得一个空的 main.cmain()

$ gcc --verbose main.c
Using built-in specs.
COLLECT_GCC=gcc
[...]
Thread model: posix
gcc version 7.5.0 (Ubuntu 7.5.0-3ubuntu1~18.04) 
[...]
COLLECT_GCC_OPTIONS='-v' '-mtune=generic' '-march=x86-64'
 /usr/lib/gcc/x86_64-linux-gnu/7/collect2 [...] -pie -z now -z relro [...]
Run Code Online (Sandbox Code Playgroud)

我在默认安装 gcc 的 Ubuntu 18.04 和 19.04 中看到了这一点。

所以-z lazy可能是 ld 的默认值,但是 gcc 在哪里/为什么将其更改为-z now -z relro?

linux gcc ld linker-flags

4
推荐指数
1
解决办法
5174
查看次数

标签 统计

c++ ×1

gcc ×1

ld ×1

linker-flags ×1

linux ×1