我发现如果我使用 lambda 来捕获对具有 mutable 关键字的全局变量的引用,然后修改 lambda 函数中的值,则结果在编译器之间是不同的。
#include <stdio.h>
#include <functional>
int n = 100;
std::function<int()> f()
{
int &m = n;
return [m] () mutable -> int {
m += 123;
return m;
};
}
int main()
{
int x = n;
int y = f()();
int z = n;
printf("%d %d %d\n", x, y, z);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
结果来自 VS 2015 和 GCC (g++ (Ubuntu 5.4.0-6ubuntu1~16.04.12) 5.4.0 20160609):
100 223 100
Run Code Online (Sandbox Code Playgroud)
结果来自 clang++(clang 版本 3.8.0-2ubuntu4 (tags/RELEASE_380/final)):
100 223 …Run Code Online (Sandbox Code Playgroud) 我想编写一个函数,输入一个数据数组并使用指针输出另一个数据数组。
我想知道如果两者都指向同一个地址会产生什么结果src,dst因为我知道编译器可以针对 const 进行优化。这是未定义的行为吗?(我标记了 C 和 C++,因为我不确定它们之间的答案是否不同,我想了解两者。)
void f(const char *src, char *dst) {
dst[2] = src[0];
dst[1] = src[1];
dst[0] = src[2];
}
int main() {
char s[] = "123";
f(s,s);
printf("%s\n", s);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
除了上面的问题,如果我删除const原来的代码,这个定义是否明确?
尝试后,我想知道为什么 GCC 能够在未使用的malloc或new缓冲区上执行 DCE而不能在未使用的上执行 DCE vector?
malloc案例:https : //godbolt.org/z/xKx5Y1
void fun() {
int *x = (int *)malloc(sizeof(int) * 100);
}
Run Code Online (Sandbox Code Playgroud)
结果组装:
fun():
ret
Run Code Online (Sandbox Code Playgroud)
new案例:https : //godbolt.org/z/66drKr
void fun() {
int *x = new int[100];
}
Run Code Online (Sandbox Code Playgroud)
结果组装:
fun():
ret
Run Code Online (Sandbox Code Playgroud)
vector案例:https : //godbolt.org/z/TWhE1E
void fun() {
vector<int> x(100);
}
Run Code Online (Sandbox Code Playgroud)
结果组装:
fun():
sub rsp, 8
mov edi, 400
call operator new(unsigned long)
mov esi, 400
lea rdi, [rax+8]
mov rcx, rax
mov …Run Code Online (Sandbox Code Playgroud)