代码之家  ›  专栏  ›  技术社区  ›  user17732522

C中是否允许以命名返回值优化的形式进行复制省略?

  •  5
  • user17732522  · 技术社区  · 8 月前

    以下C程序是否保证退出 0 或者是否允许编译器识别对象 s t 如C++中所允许的那样 命名返回值优化 (NRVO)复制省略形式?

    typedef struct {
        int i, j;
        double a, b;
    } S;
    
    int result;
    
    S test(S* q) {
        S s = {0, 0, 0, 0};
        result = &s == q;
        return s;
    }
    
    int main(void)
    {
      S t = test(&t);
      return result;
    }
    

    Clang退出 1 出乎我的意料,看看 https://godbolt.org/z/ME8sPGn3n .

    (在C++中,两者 0 1. 由于明确允许执行NRVO,这些结果是有效的。)

    1 回复  |  直到 8 月前
        1
  •  7
  •   KamilCuk    8 月前

    保证以0退出。 t s 它们是不同的对象,指向它们的指针不能相等。


    关于您删除的代码:

    以下相关寿命考虑因素可能不同的变化呢?

    https://port70.net/~nsz/c/c11/n1570.html#6.2.4p2 :

    当指针指向的对象(或刚刚过去的对象)到达其生命周期结束时,指针的值变得不确定。

    它可能返回1或0或执行陷阱。