我刚刚听完了Scott Meyers关于C++ 0x的软件工程电台播客采访.大多数新功能对我来说都很有意义,我现在对C++ 0x感到兴奋,除了一个.我仍然没有得到移动语义 ......它们究竟是什么?
在C++ 03中,表达式是rvalue或lvalue.
在C++ 11中,表达式可以是:
两类已成为五大类.
我是C++编程的新手,但我有Java经验.我需要有关如何将对象传递给C++中的函数的指导.
我是否需要传递指针,引用或非指针和非引用值?我记得在Java中没有这样的问题,因为我们只传递了保存对象引用的变量.
如果您还可以解释在哪里使用这些选项,那将会很棒.
我目前正在研究如何编写高效的C++代码,在函数调用方面,我想到了一个问题.比较这个伪代码功能:
not-void function-name () {
do-something
return value;
}
int main () {
...
arg = function-name();
...
}
Run Code Online (Sandbox Code Playgroud)
使用其他相同的伪代码功能:
void function-name (not-void& arg) {
do-something
arg = value;
}
int main () {
...
function-name(arg);
...
}
Run Code Online (Sandbox Code Playgroud)
哪个版本更有效,以及在什么方面(时间,内存等)?如果它取决于,那么第一个什么时候会更有效率,什么时候第二个会更高效?
编辑:对于上下文,此问题仅限于与硬件平台无关的差异,并且大多数情况下也是软件.是否有任何与机器无关的性能差异?
编辑:我不知道这是一个重复.另一个问题是将参考传递(上游代码)与传递值(下图)进行比较:
not-void function-name (not-void arg)
Run Code Online (Sandbox Code Playgroud)
这跟我的问题不一样.我的重点不在于将参数传递给函数的更好方法.我关注的是这是更好的方式来传递出一个结果来自外部范围的变量.
我想知道在C++ 11中我还需要在参数中使用const引用.我不完全理解移动语义,但我认为这是一个合法的问题.此问题仅适用于const引用替换正在进行的副本而仅需要"读取"该值(例如const成员函数的使用)的情况.
通常我会写一个(成员)函数,如下所示:
#include <vector>
template<class T>
class Vector {
std::vector<T> _impl;
public:
void add(const T& value) {
_impl.push_back(value);
}
};
Run Code Online (Sandbox Code Playgroud)
但是我认为可以安全地假设编译器会使用移动语义来优化它,如果我这样写它并且class Tofcourse实现了一个移动构造函数:
#include <vector>
template<class T>
class Vector {
std::vector<T> _impl;
public:
void add(T value) {
_impl.push_back(value);
}
};
Run Code Online (Sandbox Code Playgroud)
我对吗?如果是这样,假设它可以在任何情况下使用是否安全?如果没有,我想知道哪个.这将使生活变得更加容易,因为我不必为基本类型实现类专门化,例如,它看起来更清晰.
这是我从来没有用const-ref得到的东西,我真的希望有人可以向我解释.
当调用另一个函数内部的函数时,我得到的const-ref是传递我不打算篡改的堆栈对象的最佳方法.例如:
void someInnerFunction(const QString& text) {
qDebug() << text;
}
void someFunction() {
QString test = "lala";
....
someInnerFunction(test);
}
Run Code Online (Sandbox Code Playgroud)
到目前为止,我觉得这么好.但信号怎么样?传递参考文件是否存在任何风险?即便如此const.感觉就像我一直在阅读关于const-ref的所有文档,但我仍然觉得有点冒险,因为我将其理解为"发送一个对象的引用并保持它const".如果它所指的对象超出范围怎么办?
例如:
void someFunction() {
connect(this, SIGNAL(someSignal(const QString&)), this, SLOT(someSlot(const QString&)));
QString test = "lala";
emit someSignal(test);
// doesnt test go out of scope here? and since im not using queued connection the QString object doesnt get copied.
}
void someSlot(const QString& test) {
qDebug() << test; // will this work?
}
Run Code Online (Sandbox Code Playgroud)
这里到底发生了什么?我经常在函数调用中使用const-ref,我只想访问该对象但不更改它.但信号怎么样?大多数信号在Qt doc中似乎都有const-ref parm,但它是如何工作的?
c++ qt signals-slots const-reference pass-by-const-reference
例如,这就是我写它的方式,它编译并且工作得很好:
template<typename T> struct is_pointer<T*> {
static const bool value = true;
}
Run Code Online (Sandbox Code Playgroud)
那么为什么有些人写的不太明显
template<typename T> struct is_pointer<T*> {
enum { value = true };
}
Run Code Online (Sandbox Code Playgroud)
代替?是不是因为static const变量使用了一个字节的内存,而enum不是?
我做了一些测试,其中我有两个场景,每个场景有两个相同的功能 - 一个通过引用传递参数,另一个通过值传递.带有字符串的场景显示了大量的性能提升(因为创建了一个字符串的副本,调用了构造函数),而使用long的测试在通过引用传递值时没有显示任何性能提升.事实上,有时表现更差.
这是原始类型的预期吗?没有必要通过引用传递它们吗?
我期待在不使用引用的情况下制作原始类型的副本,因此期望小的性能提升.
可能重复:
在C++中通过值传递或通过常量引用传递是否更好?
我知道在C++中传递值,指针和引用的区别,我会考虑在C++中按值(而不是const引用)传递对象几乎总是编程错误.
void foo(Obj o); ... // Bad
void foo(const Obj &o); ... // Better
Run Code Online (Sandbox Code Playgroud)
唯一可以考虑通过值而不是const引用传递的地方的唯一情况是对象小于引用的位置,因此传递值更有效.
但是,这肯定是构建编译器以确定的那种东西吗?
为什么C++实际上需要传递值并通过const引用传递,并且 - 编译器是否允许自动将调用转换为(和来自)const引用(如果适用)?
(似乎有100个C++调用约定问题,询问(比如)值和引用之间的差异 - 但我找不到一个问"为什么?".)
c++ ×9
c++-faq ×4
c++11 ×3
const ×2
enums ×1
expression ×1
function ×1
inheritance ×1
performance ×1
pointers ×1
qt ×1
return-value ×1
static ×1
templates ×1