相关疑难解决方法(0)

C++ 11-一直使用nullptr?

我只是有点困惑.

我什么时候应该使用nullptr?

我已经在一些网站上看到应该总是使用它,但是我不能为非指针设置nullptr,例如:

int myVar = nullptr; // Not a pointer ofcourse
Run Code Online (Sandbox Code Playgroud)

我应该总是使用NULL非指针和nullptr指针吗?

感谢任何帮助!我对c ++ 11(和c ++整体)很新.

pointers nullptr c++11

8
推荐指数
1
解决办法
2512
查看次数

以下代码是否调用未定义的行为?

我想做这样的事情

#include <iostream>
#include <memory>

struct Foo {};

using FooPtr = std::unique_ptr<Foo>;

FooPtr makeFoo() { return FooPtr(new Foo()); }

struct Baz
{
    Baz(FooPtr foo) : Baz(std::move(foo), bar(foo)) {}
    Baz(FooPtr foo, int something) : _foo{ std::move(foo) }, _something{ something } {}
private:
    FooPtr _foo;
    int _something;

    static int bar(const FooPtr & ptr)
    {
        std::cout << "bar!" << std::endl;
        return 42;
    }
};

int main() {
    Baz baz(makeFoo());
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我的问题是:函数参数求值的顺序是未指定的,因此传递将从一个参数中移出的值是安全的,并且调用具有相同实例的另一个函数的结果作为reference-to-const传递,作为另一个论点?

我认为这个问题可以归结为实际移动操作何时执行,我不完全清楚(特别是在开启优化时).

c++ move rvalue sequence-points c++11

8
推荐指数
1
解决办法
430
查看次数

std :: vector <bool>优化实现

文档中,我可以看到std::vector<bool>通过使每个布尔占据一个位来优化空间效率.从文档:

std :: vector的空间效率(以及它是否完全优化)是实现定义的方式.

这是否意味着它取决于编译器的实现?如果是,我在哪里可以检查我的编译器是否支持它?他们为什么不希望它得到支持?这似乎是一个非常简单而有效的实现.

如果没有,它意味着什么,如果我希望进行这种优化,它意味着什么?

我正在使用TDM GCC工具集.

c++ optimization boolean vector tdm-gcc

8
推荐指数
1
解决办法
844
查看次数

允许 struct 字段溢出到下一个字段

考虑以下简单示例:

struct __attribute__ ((__packed__)) {
 int code[1];
 int place_holder[100];
} s;

void test(int n)
{
 int i;

 for (i = 0; i < n; i++) {
  s.code[i] = 1;
 }
}
Run Code Online (Sandbox Code Playgroud)

for 循环正在写入code大小为 1 的字段 。之后的下一个字段codeplace_holder
我希望在 的情况下n > 1,写入code数组会溢出并1写入place_holder.

但是,在使用-O2(在 gcc 4.9.4 上但也可能在其他版本上)进行编译时,会发生一些有趣的事情。
编译器识别出代码可能溢出数组code,并将循环展开限制为 1 次迭代

很容易看出,在编译-fdump-tree-all和查看最后一个树传递(“t.optimized”)时:


;; Function test (test, funcdef_no=0, decl_uid=1366, symbol_order=1)

Removing basic block …
Run Code Online (Sandbox Code Playgroud)

c gcc struct compiler-optimization loop-unrolling

8
推荐指数
2
解决办法
538
查看次数

C中的作用域仅与编译时间相关,因为我们知道我们可以在运行时访问任何内存吗?

我试图理解C中范围的确切含义.我能理解的是范围仅限于编译时间.例如,如果您从其他某个函数访问局部变量.这将导致编译时错误.另一方面,以下程序工作正常.这意味着C具有平坦的内存模型,并且可以在运行时访问任何内容.C书将范围与生命周期和可变可见性联系起来,我发现它很混乱.我认为所有这些术语仅适用于编译时.有人可以点亮吗?

#include "stdio.h"

int *ptr;

int func(void)
{
  /** abc is a local variable **/
  int abc = 132;
  ptr = &abc;
  return 0;
}

int func1(void)
{

  /** although scope of abc is over still I can change the value in the address  of abc **/
  *ptr = 200;
  printf("the value of abc=%d\r\n",*ptr);

}

int main(void)
{
   func();
   func1();
   return 0;
}
Run Code Online (Sandbox Code Playgroud)

结果:值abc= 200

用简单的话来说,范围是什么意思?它是在运行时还是编译时出现的?我们可以看到,我们可以在运行时访问任何内容.但是,如果我们不遵守规则,那么我们将得到编译错误.例如,另一个函数中的局部变量引用.编译器将抛出一个错误,说"变量未定义......".

我可以对变量说以下内容吗?

1) Scope attribute comes under compile time.
2) Lifetime attribute comes …
Run Code Online (Sandbox Code Playgroud)

c

7
推荐指数
1
解决办法
420
查看次数

std :: map :: begin()之前的STL迭代器

在C++ 11中std::map,是否有一些有效的迭代器x使得++ x保证相等map::begin()?我想检测一下我刚刚调用的函数(我的)是否已经从函数前面走了一个迭代器.该函数将迭代器向后移动一个位置.

答案是否适用于图书馆的其他部分?

c++ iterator stl c++11 reverse-iterator

7
推荐指数
2
解决办法
6663
查看次数

具有未定义结果的C代码,编译器生成无效代码(使用-O3)

我知道当你在C程序中做某些事情时,结果是不确定的.但是,编译器不应该生成无效(机器)代码,对吧?如果代码做错了,或者代码生成了段错误或其他什么,那将是合理的......

这应该是根据编译器规范发生的,还是编译器中的错误?

这是我正在使用的(简单)程序:

int main() {
    char *ptr = 0;
    *(ptr) = 0;
}
Run Code Online (Sandbox Code Playgroud)

我正在编译-O3.那不应该生成无效的硬件指令,对吧?有了-O0,我在运行代码时遇到了段错误.这看起来更加明智.

编辑:它正在生成一条ud2指令......

c gcc undefined-behavior

7
推荐指数
1
解决办法
1555
查看次数

(x+1) &gt; x 如何评估为 0 和 1?

我正在学习未定义的行为,并在没有任何明确解释的情况下偶然发现了这段代码:

#include <stdio.h>
#include <limits.h>

int foo ( int x) {
    printf ("% d\n" ,  x );   //2147483647
    printf ("% d\n" ,  x+1 ); //-2147483648  overflow
    return ( x+1 ) > x ;      // 1 but How????
}

int main ( void ) {
    printf ("% d\n" ,  INT_MAX );     //2147483647
    printf ("% d\n" ,  INT_MAX+1 );   //-2147483648  overflow
    printf ("% d\n" , ( INT_MAX+1 ) > INT_MAX );  //0  makes sense, since -ve < +ve
    printf ("% d\n" , …
Run Code Online (Sandbox Code Playgroud)

c c++ undefined-behavior

7
推荐指数
1
解决办法
265
查看次数

在没有 lambda 的情况下将模板化函数作为方法参数传递?

我确实希望能够在不声明 lambda 的情况下使用 extFunction or std::maxorstd::min作为 square 方法的参数:

template<typename T>
T extFunction(T a, T b)
{
    return a;
}

class Stuff
{
public:
    template <typename F>
    int square(int num, int num2, F&& func) 
    {
        return func(num, num2);
    }
};

int main()
{
    Stuff s;
    std::cout << s.square(1, 2, std::max<int>) << std::endl;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

但是编译器(gcc 11.1)告诉我:

函数不明确:“无法推导出模板参数‘ F’”

没有 lambdas 有没有一种简单的方法可以做到这一点?

编辑:

也许展示如何使用 lambdas 做到这一点会很有趣:

std::cout << s.square(1,2,[](auto&& a, auto&& b){return std::max(a,b);}) << std::endl; …
Run Code Online (Sandbox Code Playgroud)

c++ lambda templates function-pointers function-templates

7
推荐指数
1
解决办法
268
查看次数

在这个 C 程序中,由于某种奇怪的原因,代码中的第 5 行打印了 1.799999,这是没有意义的

#include<stdio.h>
void main(){
   printf("%f\n",5/9);  // prints 0.000000
   printf("%f\n",9.0/5.0); // prints 1.800000
   printf("%f\n",5/9);  // prints 1.799999
}
Run Code Online (Sandbox Code Playgroud)

第 5 行值应像第 3 行一样打印 0.000000

我在本地机器和在线编译器中尝试过,结果是相同的

c printf

7
推荐指数
2
解决办法
139
查看次数