相关疑难解决方法(0)

什么是移动语义?

我刚刚听完了Scott Meyers关于C++ 0x的软件工程电台播客采访.大多数新功能对我来说都很有意义,我现在对C++ 0x感到兴奋,除了一个.我仍然没有得到移动语义 ......它们究竟是什么?

c++ c++-faq move-semantics c++11

1614
推荐指数
11
解决办法
39万
查看次数

什么是右值,左值,x值,glvalues和prvalues?

在C++ 03中,表达式是rvaluelvalue.

在C++ 11中,表达式可以是:

  1. 右值
  2. 左值
  3. x值
  4. glvalue
  5. prvalue

两类已成为五大类.

  • 这些新的表达类别是什么?
  • 这些新类别如何与现有的左值和左值类别相关联?
  • C++ 0x中的右值和左值类别是否与它们在C++ 03中的相同?
  • 为什么需要这些新类别?是WG21神只是想迷惑我们凡人?

c++ expression c++-faq c++11

1291
推荐指数
13
解决办法
17万
查看次数

709
推荐指数
11
解决办法
17万
查看次数

如何将对象传递给C++中的函数?

我是C++编程的新手,但我有Java经验.我需要有关如何将对象传递给C++中的函数的指导.

我是否需要传递指针,引用或非指针和非引用值?我记得在Java中没有这样的问题,因为我们只传递了保存对象引用的变量.

如果您还可以解释在哪里使用这些选项,那将会很棒.

c++ pointers c++-faq pass-by-reference pass-by-value

245
推荐指数
4
解决办法
13万
查看次数

哪个更有效:返回值与通过引用传递?

我目前正在研究如何编写高效的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++ performance function return-value pass-by-reference

70
推荐指数
5
解决办法
2万
查看次数

C++ 11 Const引用VS移动语义

我想知道在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 move-semantics c++11

33
推荐指数
1
解决办法
9936
查看次数

在Qt中发送信号时的const-ref

这是我从来没有用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

26
推荐指数
1
解决办法
1万
查看次数

在类型特征中,为什么人们使用枚举而不是静态const作为值?

例如,这就是我写它的方式,它编译并且工作得很好:

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不是?

c++ enums static templates const

19
推荐指数
3
解决办法
2294
查看次数

通过引用传递原始类型会适得其反吗?

可能重复:
基于数据类型传递值或引用是否更好?
没有通过引用传递简单类型的原因?

我做了一些测试,其中我有两个场景,每个场景有两个相同的功能 - 一个通过引用传递参数,另一个通过值传递.带有字符串的场景显示了大量的性能提升(因为创建了一个字符串的副本,调用了构造函数),而使用long的测试在通过引用传递值时没有显示任何性能提升.事实上,有时表现更差.

这是原始类型的预期吗?没有必要通过引用传递它们吗?

我期待在不使用引用的情况下制作原始类型的副本,因此期望小的性能提升.

c++

17
推荐指数
4
解决办法
1万
查看次数

为什么要在C++中按值传递对象?

可能重复:
在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++ calling-convention

15
推荐指数
3
解决办法
3474
查看次数