在关于优化和代码风格的C++问题中,在优化副本的上下文中,有几个答案提到了"SSO" std::string.在这种情况下,SSO意味着什么?
显然不是"单点登录"."共享字符串优化",或许?
我看到某个地方有人决定复制一个对象并随后将其移动到一个类的数据成员的代码.这使我感到困惑,因为我认为移动的重点是避免复制.这是一个例子:
struct S
{
S(std::string str) : data(std::move(str))
{}
};
Run Code Online (Sandbox Code Playgroud)
这是我的问题:
str?std::string吗?如果std::string支持移动语义,我应该通过值传递还是通过引用传递(到非内联函数)?那么使用小字符串优化(SSO)的实现呢?
我正在使用带std::string钥匙的地图,虽然一切正常,但我没有达到预期的性能.我搜索了一些地方来优化和改进一些东西,当一位同事说,"那个字符串键会变慢."
我读了几十个问题,他们一直说:
"不要使用
char *键作为键"
"std::string键永远不是你的瓶颈"
"achar *和a 之间的性能差异std::string是一个神话."
我不情愿地尝试了一把char *钥匙而且有区别,差别很大.
我将问题归结为一个简单的例子:
#include <stdio.h>
#include <stdlib.h>
#include <map>
#ifdef USE_STRING
#include <string>
typedef std::map<std::string, int> Map;
#else
#include <string.h>
struct char_cmp {
bool operator () (const char *a,const char *b) const
{
return strcmp(a,b)<0;
}
};
typedef std::map<const char *, int, char_cmp> Map;
#endif
Map m;
bool test(const char *s)
{
Map::iterator it = m.find(s);
return it != m.end(); …Run Code Online (Sandbox Code Playgroud) 我试图理解移动语义,右值引用std::move等等.我一直试图通过搜索本网站上的各种问题来解决,如果需要复制,为什么传递const std::string &name+ _name(name)不如std::string name+ + _name(std::move(name)).
如果我理解正确,下面需要一个副本(通过构造函数)加上一个移动(从临时到成员):
Dog::Dog(std::string name) : _name(std::move(name)) {}
Run Code Online (Sandbox Code Playgroud)
替代(和老式)方法是通过引用传递它并将其复制(从引用到成员):
Dog::Dog(const std::string &name) : _name(name) {}
Run Code Online (Sandbox Code Playgroud)
如果第一种方法需要复制并同时移动两种方法,而第二种方法只需要一个副本,那么第一种方法如何首选,在某些情况下更快?
我正在尝试获取大文件(12gb +)的文件大小,我不想打开文件这样做,因为我认为这会占用大量资源.有没有好的API可以这样做?我在Windows环境中.
由于const引用与传递值几乎相同,但没有创建副本(据我所知).那么是否需要创建变量的副本(因此我们需要使用pass by value).
对于构造函数如下,如何确定它?
class A
{
public:
A(string str) : mStr(str) {} // here which is better,
// pass by value or const reference?
void setString(string str) { mStr = str; } // how about here?
private:
string mStr;
};
Run Code Online (Sandbox Code Playgroud) c++ ×10
string ×3
c++11 ×2
arguments ×1
c++-faq ×1
const ×1
dictionary ×1
function ×1
optimization ×1
performance ×1
std ×1
stdmap ×1
types ×1
winapi ×1
windows ×1