相关疑难解决方法(0)

Objective-C 是否有 C++11 右值引用和移动语义等效项或者如何实现?

我正在学习 Objective-C。我有这样一个“学术”问题,是向精通现代 C++ (C++11) 的 Objective-C 专家提出的。

在 C++11 中,我经常使用移动语义(使用对临时对象的引用我们可以避免不必要的复制):
什么是移动语义?
http://www.cprogramming.com/c++11/rvalue-references-and-move-semantics-in-c++11.html

这些链接适用于不熟悉移动语义概念的 Objective-C 编码人员,我感兴趣的是 Objective-C 是否有类似的东西,或者可能有一些方法来实现/模拟它?

c++ objective-c copy-constructor move-semantics c++11

5
推荐指数
1
解决办法
1298
查看次数

为什么std :: pair类标准被改为禁止在C++ 11中只有非常量复制构造函数的类型?

我正在阅读Nicolai M. Josuttis的"The C++标准库(第二版)"并刚刚进入了该部分std::pair.作者指出:

从C++ 11开始,pair<>使用只有非常量复制构造函数的类型将不再编译.

然后他继续给出以下示例:

class A 
{
   public:
     ...
     A( A& ); // copy constructor with nonconstant reference
     ...
};

std::pair<A, int> p; // Error since C++11
Run Code Online (Sandbox Code Playgroud)

但是,我对标准委员会决定对标准库标准进行修改的原因感兴趣吗?我试图谷歌的原因,但没有找到任何相关的东西.

c++ copy-constructor move-semantics c++11

5
推荐指数
1
解决办法
373
查看次数

移动大型非指针基础对象的语义

当我阅读关于移动语义和右值引用的示例时,它们正在利用rvalue引用的优点并在围绕指针的 大对象周围移动语义,例如:1 2

例如,它们只是复制移动对象内的指针并将其设置为nullptr.(移动/交换)

我的问题是,移动语义对于没有指针但是它们很大的对象有任何优势(性能)吗?

class BigClass
{
   int data[BIG_SIZE];
   int a01;
   .
   .
   . many members
   .
   .
   int z99;

public:

   move constructor ?!
};
Run Code Online (Sandbox Code Playgroud)

c++ c++11

5
推荐指数
1
解决办法
754
查看次数

C++按值传递非原始类型?

我必须对C++ 11有一个基本的误解.我的教授告诉我,除了引用或指针之外,不可能将非原始类型传递给函数.但是,以下代码工作得很好

#include <iostream>
using namespace std;

class MyClass
{
public: 
    int field1;
};

void print_string(string s) { 
    cout << s << endl; 
}

void print_myclass(MyClass c) { 
    cout << c.field1 << endl; 
}

int main(int argc, char *argv[]) 
{
    string mystr("this is my string"); 
    print_string(mystr); // works
    MyClass m; 
    m.field1=9; 
    print_myclass(m); 
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

运行该程序会产生以下输出

this is my string
9

RUN SUCCESSFUL (total time: 67ms)
Run Code Online (Sandbox Code Playgroud)

我在Win7上使用MinGW/g ++

为什么这样做?我以为非原始类型不能通过值传递?!

c++ class parameter-passing pass-by-value

5
推荐指数
1
解决办法
3368
查看次数

在 std::vector push_back() 和 std::map operator[] 中通过 &amp;&amp; 取参数

我在 std::vector::push_back() 实现中发现了这个:

void push_back(_Ty&& _Val)
{
    // some code here       
}
Run Code Online (Sandbox Code Playgroud)

这在 std::map operator[] 实现中:

mapped_type& operator[](key_type&& _Keyval)
{
    // some code here   
}
Run Code Online (Sandbox Code Playgroud)

为什么 _Val 和 _Keyval 是逐个引用的?逐个引用的论证是如何工作的?与参考文献相比,这种方法有什么好处?

PS 这不是逻辑“与”,我清楚地理解这一点。

c++ stl reference vector map

5
推荐指数
1
解决办法
839
查看次数

调用移动构造函数时

我想知道何时在C++代码中调用move构造函数.

这意味着,我知道当我调用Foo a(b)它时是复制构造函数,那么我有什么代码来调用移动构造函数.

c++ constructor c++11

5
推荐指数
1
解决办法
288
查看次数

如何复制构造函数和移动构造函数

我的问题是要了解这两个构造函数究竟是如何工作的.我有这门课:

class moveClass
{
  int variabile;
  public:
  moveClass(){} 
      //move constructor
  moveClass(moveClass && arg)
  {
    cout<<"Call move constructor"<<endl;
    variabile = arg.variabile;
  } 
      //copy constructor
  moveClass(const moveClass & arg)
  {
    cout<<"Call copy constructor"<<endl;
    variabile = arg.variabile;
  }  
};
Run Code Online (Sandbox Code Playgroud)

根据我的理解,当我实例化该类的新对象时,将根据参数的类型调用构造函数.

移动构造函数的优点是当rvalue用于实例化对象时,该对象不会被复制,而只是被移动.

1 moveClass a;
2 moveClass b = a;
3 moveClass c = std::move(a);
Run Code Online (Sandbox Code Playgroud)

考虑到这个例子,我可以说当我实例b时,a被复制,然后分配给b?

换句话说,直到第2行,我将在内存中有3个对象:a,b和a_copy.

而第3行只会创建c对象而没有新的复制对象.

基本上在这三行的末尾,我将在内存中有4个对象.它是否正确?

构造函数的代码也是一样的,所以我希望唯一的区别是传递的参数的类型.

c++ copy-constructor move-semantics

5
推荐指数
0
解决办法
106
查看次数

C++:类方法前面的"const"

以此方法声明为例:

const Vector Vector::operator - ( const Vector& other ) const;
Run Code Online (Sandbox Code Playgroud)

我知道第二个const使Vector作为参数传递为immutable,并且最后一个const声明该方法不会更改Vector类的当前实例....

  • 但是第一个const意味着什么或者导致什么呢?

c++

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

如何将对象移动到未初始化的内存中?

给定已分配但未初始化的内存位置,如何将某个对象移动到该位置(销毁原始对象),而不构建可能昂贵的中间对象?

c++ move-semantics c++11

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

如何使用新语法

当我读一些文章时,我发现这条线是如此神秘.

new (new_ptr + i) T(std::move(old_ptr[i]));
Run Code Online (Sandbox Code Playgroud)

有人可以解释这种语法是如何工作的吗?

c++

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