小编Wil*_*lly的帖子

lambda 函数从全局变量的引用中可变捕获的行为差异

我发现如果我使用 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)

c++ lambda language-lawyer c++11

22
推荐指数
2
解决办法
964
查看次数

带有指向非常量的指针和指向相同地址的常量参数的指针的函数调用

我想编写一个函数,输入一个数据数组并使用指针输出另一个数据数组。

我想知道如果两者都指向同一个地址会产生什么结果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原来的代码,这个定义是否明确?

c c++ constants undefined-behavior

15
推荐指数
2
解决办法
549
查看次数

为什么像 GCC 这样的编译器不能对 vector 做死代码消除?

尝试后,我想知道为什么 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)

c++ compiler-optimization

2
推荐指数
1
解决办法
126
查看次数