我来自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++中找到两个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文件,但我认为它产生了一些优化版本的程序.有什么办法可以让我看到与我的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被称为:
res被调用(价值res就是"A")w调用构造函数return res被执行.应该返回res的当前值(通过复制当前值res),即"A".w被称为析构函数,值res变为"AB".res函数被称为.所以我希望"A"结果,但"AB" …
由于范围问题,我对此感到疑惑.例如,考虑代码
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)
所以我的问题是,返回语句是否总是复制?在这种情况下,它似乎工作,所以我被引导相信返回确实复制.如果它复制了,它会在每种情况下复制吗?
我有一个Visual Studio 2005 C++程序,它在Release模式下的运行方式与在Debug模式下的运行方式不同.在发布模式下,发生(明显的)间歇性崩溃.在调试模式下,它不会崩溃.Release构建与Debug构建不同的原因是什么?
值得一提的是,我的程序相当复杂,并使用多个第三方库进行XML处理,消息代理等...
提前致谢!
可能重复:
复制初始化和赋值初始化之间的C++是否存在差异?
有什么区别
T a(b);
Run Code Online (Sandbox Code Playgroud)
和
T a = b;
Run Code Online (Sandbox Code Playgroud)
和
T a = T(b);
Run Code Online (Sandbox Code Playgroud)
?
我正在阅读复制和交换.
我尝试阅读Copy Elision上的一些链接,但无法弄清楚它的含义.有人可以解释一下这种优化是什么,特别是下面的文字是什么意思
这不仅仅是为了方便,而且实际上是一种优化.如果参数绑定到左值(另一个非常量对象),则在创建参数时会自动创建对象的副本.但是,当s绑定到rvalue(临时对象,文字)时,通常会省略该副本,从而保存对复制构造函数和析构函数的调用.在赋值运算符的早期版本中,参数被接受为const引用,当引用绑定到右值时,不会发生复制省略.这导致创建和销毁另外的对象.
返回值优化(RVO)是一种涉及复制省略的优化技术,它消除了在某些情况下为保存函数返回值而创建的临时对象.我一般都了解RVO的好处,但我有几个问题.
该标准在本工作草案的第12段第32段(强调我的)中说明了以下内容.
当满足某些条件时,允许实现省略类对象的复制/移动构造,即使该对象的复制/移动构造函数和/或析构函数具有副作用.在这种情况下,实现将省略的复制/移动操作的源和目标视为仅仅两种不同的引用同一对象的方式,并且该对象的销毁发生在两个对象的后期时间.没有优化就被破坏了.
然后,当实现可以执行此优化时,它会列出许多条件.
关于这种潜在的优化,我有几个问题:
我习惯于约束优化,以至于它们无法改变可观察的行为.此限制似乎不适用于RVO.我是否需要担心标准中提到的副作用?是否存在可能导致问题的角落案例?
作为程序员,我需要做什么(或不做)才能执行此优化?例如,以下是否禁止使用复制省略(由于move):
std::vector<double> foo(int bar){
std::vector<double> quux(bar,0);
return std::move(quux);
}
Run Code Online (Sandbox Code Playgroud)
我将此作为一个新问题发布,因为我提到的具体问题在其他相关问题中没有直接回答.