我正在学习 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 是否有类似的东西,或者可能有一些方法来实现/模拟它?
我正在阅读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)
但是,我对标准委员会决定对标准库标准进行修改的原因感兴趣吗?我试图谷歌的原因,但没有找到任何相关的东西.
当我阅读关于移动语义和右值引用的示例时,它们正在利用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++ 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 ++
为什么这样做?我以为非原始类型不能通过值传递?!
我在 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++代码中调用move构造函数.
这意味着,我知道当我调用Foo a(b)它时是复制构造函数,那么我有什么代码来调用移动构造函数.
我的问题是要了解这两个构造函数究竟是如何工作的.我有这门课:
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个对象.它是否正确?
构造函数的代码也是一样的,所以我希望唯一的区别是传递的参数的类型.
以此方法声明为例:
const Vector Vector::operator - ( const Vector& other ) const;
Run Code Online (Sandbox Code Playgroud)
我知道第二个const使Vector作为参数传递为immutable,并且最后一个const声明该方法不会更改Vector类的当前实例....
const意味着什么或者导致什么呢?给定已分配但未初始化的内存位置,如何将某个对象移动到该位置(销毁原始对象),而不构建可能昂贵的中间对象?
当我读一些文章时,我发现这条线是如此神秘.
new (new_ptr + i) T(std::move(old_ptr[i]));
Run Code Online (Sandbox Code Playgroud)
有人可以解释这种语法是如何工作的吗?