当我读一些文章时,我发现这条线是如此神秘.
new (new_ptr + i) T(std::move(old_ptr[i]));
Run Code Online (Sandbox Code Playgroud)
有人可以解释这种语法是如何工作的吗?
我有一个包含std :: string的Text类.一个方法SetText如下:
void Text::SetText( const std::string& str )
{
m_str = str;
}
Run Code Online (Sandbox Code Playgroud)
因为这个方法几乎总是以rvalues作为参数调用,所以我想到了移动构造函数.我理解基础知识,但这就是全部.所以我做了测试并得出结论,像这样的另一个函数会更好,一旦定义了移动构造函数和移动分配,就可以获得性能提升:
void Text::SetText( std::string&& str )
{
m_str = move( str );
}
Run Code Online (Sandbox Code Playgroud)
有我的问题:
谢谢.
当将两个元素推入向量时,我认为应该两次使用复制运算符。当对象解构时使用析构函数。但是,结果表明它使用了3次复制构造函数,并在推送对象后立即使用了一次析构函数。那么这个问题的原因是什么呢?
using namespace std;
struct X {
X() { cout << "X()" << endl; }
X(const X&) { cout << "X(const X&)" << endl; }
X& operator=(const X& xr) { cout << "operator=(const X& xr)" << endl; return *this; }
~X() { cout << "~X()" << endl; }
};
void fcn1(X x1, X &x2, X *x3) {
cout << "fcn1 start" << endl;
vector<X> v1;
cout<<"push x"<<endl;
v1.push_back(x1);
v1.push_back(x2);
cout << "fcn1 end" << endl;
}
Run Code Online (Sandbox Code Playgroud) 我想编写一个跨平台(win32和linux)的函数,并返回日期时间的字符串表示[hh:mm:ss dd-mm-yyyy].
知道我只是想以流方式将返回的字符串用作临时字符,如下所示:
std::cout << DateTime() << std::endl;
Run Code Online (Sandbox Code Playgroud)
我考虑使用以下原型编写函数
const char* DateTime();
Run Code Online (Sandbox Code Playgroud)
如果返回字符数组,则必须在完成后将其删除.但我只想暂时,我不想担心取消分配字符串.
所以我编写了一个只返回std :: string的函数:
#include <ctime>
#include <string>
#include <sstream>
std::string DateTime()
{
using namespace std;
stringstream ss;
string sValue;
time_t t = time(0);
struct tm * now = localtime(&t);
ss << now->tm_hour << ":";
ss << now->tm_min << ":";
ss << now->tm_sec << " ";
ss << now->tm_mday + 1 << " ";
ss << now->tm_mon + 1 << " ";
ss << now->tm_year + 1900;
sValue …Run Code Online (Sandbox Code Playgroud) 当我阅读一些文章时,通常会一起描述rvalue引用和移动语义.但是据我所知,rvalue引用只是对rvalues的引用,并且与移动语义无关.并且甚至可以在不使用右值引用的情况下实现移动语义.所以问题是,为什么移动构造函数/运算符=使用rvalue引用?是不是只是为了更容易编写代码?
我正在读这篇文章:什么是移动语义?
请注意,移动构造函数的帖子中给出的示例是:
string(string&& that)
{
data = that.data;
that.data = nullptr;
}
Run Code Online (Sandbox Code Playgroud)
当我们string a(x+y)用来构造一个新的字符串时,我发现它很混乱.由于结果x+y是一个临时变量,它很快就会被破坏.这意味着复制指针(data = that.data)确实会复制一个悬空指针,原始数据(应该存储在x+y函数调用完成后清理的堆栈帧中)被销毁.似乎设置that.data为nullptr无济于事,因为堆栈框架无论如何都会被清理干净.
任何人都可以解释为什么这不是一个问题?c ++如何实际处理这种情况?
想象一下这个简单的简化代码片段:
ostringstream os;
os << "hello world!";
string str = os.str().c_str(); // copy of os
list<string> lst;
lst.push_back(str); // copy of str
Run Code Online (Sandbox Code Playgroud)
在WideString中有一个名为detach()的函数,它赋予被调用函数处理mem-allocation的责任.
字符串类型有这么类似的技巧吗?
我有一个std::vector<vector<double>>我想填写一个功能.我需要在我的程序中稍后为某些计算存储一些3维坐标.
我的问题是如果我这样做:
//in classdefinition
std::vector<std::vector<double>> data;
myFunc()
{
std::vector<double> temp;
temp.push_back(1);
temp.push_back(2);
temp.push_back(3);
data.push_back(temp);
temp.clear();
//new data
temp.push_back(2);
temp.push_back(3);
temp.push_back(4);
data.push_back(temp);
}
Run Code Online (Sandbox Code Playgroud)
清除和重新填充temp会影响数据中的值吗?
我已经找到了这个http://www.cplusplus.com/reference/vector/vector/push_back/, 但由于解释是"将val的内容复制(或移动)到新元素." 我不知道该怎么想.对我来说,这听起来像是一个矛盾.
我认为如果变量作为参考传递是没有多大意义的,因为它们可以像我的情况一样只在有限的范围内有效.我的假设是对的吗?
我正在阅读 std 模板库书籍,但对 STL 容器章节中列出的以下详细信息感到困惑。显然,它指定了 STD::VECTOR 操作和效果
Operation Effect
vector<Elem> c(c2) | Copy constructor; creates a new vector as a copy of c2 (all elements are copied)
vector<Elem> c = c2 | Copy constructor; creates a new vector as a copy of c2 (all elements are copied)
vector<Elem> c(rv) | Move constructor; creates a new vector, taking the contents of the rvalue rv (since C++11)
vector<Elem> c = rv | Move constructor; creates a new vector, taking the contents of …Run Code Online (Sandbox Code Playgroud) 我在贸易公司工作,在这里延迟很重要。分配给我的项目是使用c和c ++ 98部分混合开发的,但是我相信我们可以使用C ++ 11进行相同的项目而不会降低效率。正如我与年长者讨论的那样,他们说您应该坚持使用C和c ++ 03,因为它们在微观层面上比C ++ 11更有效。谁能强调我?如果我使用C ++ 11,我会得到更好的结果吗?