相关疑难解决方法(0)

如何使用新语法

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

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

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

c++

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

c ++移动语义澄清

我有一个包含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)

有我的问题:

  • 它适用于标准容器吗?他们是否提供移动构造和分配?
  • 当没有堆分配时,移动语义是否有用?(我的意思是根本没有堆分配,所以没有智能指针作为类成员)

谢谢.

c++ c++11

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

将对象推入向量时如何计算使用复制构造函数的次数?

当将两个元素推入向量时,我认为应该两次使用复制运算符。当对象解构时使用析构函数。但是,结果表明它使用了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)

c++ copy-constructor

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

从函数返回一个字符串

我想编写一个跨平台(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)

c++ string return-value move-semantics c++11

3
推荐指数
2
解决办法
372
查看次数

为什么rvalue引用与移动语义相关联?

当我阅读一些文章时,通常会一起描述rvalue引用和移动语义.但是据我所知,rvalue引用只是对rvalues的引用,并且与移动语义无关.并且甚至可以在不使用右值引用的情况下实现移动语义.所以问题是,为什么移动构造函数/运算符=使用rvalue引用?是不是只是为了更容易编写代码?

c++ c++11

3
推荐指数
1
解决办法
114
查看次数

移动语义如何保留临时变量的数据?

我正在读这篇文章:什么是移动语义?

请注意,移动构造函数的帖子中给出的示例是:

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 ++如何实际处理这种情况?

c++ move-constructor move-semantics

3
推荐指数
1
解决办法
439
查看次数

为什么复制的字符串被复制复制......?

想象一下这个简单的简化代码片段:

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的责任.

字符串类型有这么类似的技巧吗?

c++

3
推荐指数
1
解决办法
136
查看次数

使用push_back将向量<double>放入向量<vector <double >>

我有一个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的内容复制(或移动)到新元素." 我不知道该怎么想.对我来说,这听起来像是一个矛盾.

我认为如果变量作为参考传递是没有多大意义的,因为它们可以像我的情况一样只在有限的范围内有效.我的假设是对的吗?

c++ stdvector

3
推荐指数
1
解决办法
540
查看次数

C++ 编译器如何决定何时为 std::vector 或任何对象调用移动构造函数

我正在阅读 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++ stl c++11

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

就效率而言,C ++ 11是否比C ++ 03快?

我在贸易公司工作,在这里延迟很重要。分配给我的项目是使用c和c ++ 98部分混合开发的,但是我相信我们可以使用C ++ 11进行相同的项目而不会降低效率。正如我与年长者讨论的那样,他们说您应该坚持使用C和c ++ 03,因为它们在微观层面上比C ++ 11更有效。谁能强调我?如果我使用C ++ 11,我会得到更好的结果吗?

c++ low-latency c++11 c++03

3
推荐指数
1
解决办法
1226
查看次数