相关疑难解决方法(0)

我为什么要使用指针而不是对象本身?

我来自Java背景,并开始使用C++中的对象.但是我遇到的一件事是人们经常使用指向对象的指针而不是对象本身,例如这个声明:

Object *myObject = new Object;
Run Code Online (Sandbox Code Playgroud)

而不是:

Object myObject;
Run Code Online (Sandbox Code Playgroud)

或者,不要使用函数,比如说testFunc():

myObject.testFunc();
Run Code Online (Sandbox Code Playgroud)

我们要写:

myObject->testFunc();
Run Code Online (Sandbox Code Playgroud)

但我无法弄清楚为什么我们这样做呢.我认为它与效率和速度有关,因为我们可以直接访问内存地址.我对吗?

c++ pointers c++11

1532
推荐指数
12
解决办法
30万
查看次数

如何在C++中找到两个std :: set的交集?

我一直在尝试在C++中找到两个std :: set之间的交集,但我一直收到错误.

我为此创建了一个小样本测试

#include <iostream>
#include <vector>
#include <algorithm>
#include <set>
using namespace std;

int main() {
  set<int> s1;
  set<int> s2;

  s1.insert(1);
  s1.insert(2);
  s1.insert(3);
  s1.insert(4);

  s2.insert(1);
  s2.insert(6);
  s2.insert(3);
  s2.insert(0);

  set_intersection(s1.begin(),s1.end(),s2.begin(),s2.end());
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

后一个程序不生成任何输出,但我希望有一个新的集合(让我们称之为s3)具有以下值:

s3 = [ 1 , 3 ]
Run Code Online (Sandbox Code Playgroud)

相反,我得到错误:

test.cpp: In function ‘int main()’:
test.cpp:19: error: no matching function for call to ‘set_intersection(std::_Rb_tree_const_iterator<int>, std::_Rb_tree_const_iterator<int>, std::_Rb_tree_const_iterator<int>, std::_Rb_tree_const_iterator<int>)’
Run Code Online (Sandbox Code Playgroud)

我从这个错误中理解的是,没有定义set_intersection接受Rb_tree_const_iterator<int>参数.

此外,我想该std::set.begin()方法返回这种类型的对象,

有没有更好的方法std::set在C++中找到两个的交集?最好是内置功能?

非常感谢!

c++ std stdset stl-algorithm

77
推荐指数
4
解决办法
6万
查看次数

保证副本省略如何运作?

在2016年奥卢ISO C++标准会议上,标准委员会将一项名为" 保证副本省略"的提案通过简化的价值类别投票进入C++ 17.

保证副本省略如何运作?是否涵盖了某些已经允许复制省略的情况,或者是否需要更改代码来保证复制省略?

c++ copy-elision c++17

75
推荐指数
1
解决办法
7883
查看次数

如何在gcc中禁用编译器优化?

我正在努力学习汇编语言.我搜索并发现如何反汇编.c文件,但我认为它产生了一些优化版本的程序.有什么办法可以让我看到与我的C文件对应的确切汇编代码.

c gcc compiler-optimization compiler-options

69
推荐指数
5
解决办法
9万
查看次数

在C++函数中"返回"的确切时刻

这似乎是一个愚蠢的问题,但是return xxx;在一个明确定义的函数中"执行" 的确切时刻?

请参阅以下示例以了解我的意思(现在直播):

#include <iostream>
#include <string>
#include <utility>

//changes the value of the underlying buffer
//when destructed
class Writer{
public:
    std::string &s;
    Writer(std::string &s_):s(s_){}
    ~Writer(){
        s+="B";
    }
};

std::string make_string_ok(){
    std::string res("A");
    Writer w(res);
    return res;
}


int main() {
    std::cout<<make_string_ok()<<std::endl;
} 
Run Code Online (Sandbox Code Playgroud)

我天真地期待发生的事情make_string_ok被称为:

  1. 构造函数res被调用(价值res就是"A")
  2. w调用构造函数
  3. return res被执行.应该返回res的当前值(通过复制当前值res),即"A".
  4. w被称为析构函数,值res变为"AB".
  5. 析构res函数被称为.

所以我希望"A"结果,但"AB" …

c++ object-lifetime language-lawyer copy-elision c++17

67
推荐指数
3
解决办法
4121
查看次数

返回语句复制值

由于范围问题,我对此感到疑惑.例如,考虑代码

typedef struct {
    int x1;/*top*/
    int x2;/*bottom*/
    int id;
} subline_t;



subline_t subline(int x1, int x2, int id) {
    subline_t t = { x1, x2, id };
    return t;
}

int main(){
    subline_t line = subline(0,0,0); //is line garbage or isn't it? the reference
    //to subline_t t goes out of scope, so the only way this wouldn't be garbage
    //is if return copies
}
Run Code Online (Sandbox Code Playgroud)

所以我的问题是,返回语句是否总是复制?在这种情况下,它似乎工作,所以我被引导相信返回确实复制.如果它复制了,它会在每种情况下复制吗?

c++ return

65
推荐指数
2
解决办法
4万
查看次数

Release构建与Debug构建的运行方式不同的原因是什么

我有一个Visual Studio 2005 C++程序,它在Release模式下的运行方式与在Debug模式下的运行方式不同.在发布模式下,发生(明显的)间歇性崩溃.在调试模式下,它不会崩溃.Release构建与Debug构建不同的原因是什么?

值得一提的是,我的程序相当复杂,并使用多个第三方库进行XML处理,消息代理等...

提前致谢!

c++ visual-studio-2005 visual-studio

55
推荐指数
3
解决办法
3万
查看次数


什么是复制省略以及它如何优化复制和交换习惯用法?

我正在阅读复制和交换.

我尝试阅读Copy Elision上的一些链接,但无法弄清楚它的含义.有人可以解释一下这种优化是什么,特别是下面的文字是什么意思

这不仅仅是为了方便,而且实际上是一种优化.如果参数绑定到左值(另一个非常量对象),则在创建参数时会自动创建对象的副本.但是,当s绑定到rvalue(临时对象,文字)时,通常会省略该副本,从而保存对复制构造函数和析构函数的调用.在赋值运算符的早期版本中,参数被接受为const引用,当引用绑定到右值时,不会发生复制省略.这导致创建和销毁另外的对象.

c++ optimization copy-and-swap copy-elision

30
推荐指数
1
解决办法
8465
查看次数

返回值优化和副作用

返回值优化(RVO)是一种涉及复制省略的优化技术,它消除了在某些情况下为保存函数返回值而创建的临时对象.我一般都了解RVO的好处,但我有几个问题.

该标准在本工作草案的第12段第32段(强调我的)中说明了以下内容.

当满足某些条件时,允许实现省略类对象的复制/移动构造,即使该对象的复制/移动构造函数和/或析构函数具有副作用.在这种情况下,实现将省略的复制/移动操作的源和目标视为仅仅两种不同的引用同一对象的方式,并且该对象的销毁发生在两个对象的后期时间.没有优化就被破坏了.

然后,当实现可以执行此优化时,它会列出许多条件.


关于这种潜在的优化,我有几个问题:

  1. 我习惯于约束优化,以至于它们无法改变可观察的行为.此限制似乎不适用于RVO.我是否需要担心标准中提到的副作用?是否存在可能导致问题的角落案例?

  2. 作为程序员,我需要做什么(或不做)才能执行此优化?例如,以下是否禁止使用复制省略(由于move):

std::vector<double> foo(int bar){
    std::vector<double> quux(bar,0);
    return std::move(quux);
}
Run Code Online (Sandbox Code Playgroud)

编辑

我将此作为一个新问题发布,因为我提到的具体问题在其他相关问题中没有直接回答.

c++ compiler-optimization c++11

26
推荐指数
2
解决办法
1738
查看次数