好吧,考虑一下我们大多数人多次使用过的常见习语(我假设):
class FooBarDictionary
{
private Dictionary<String, FooBar> fooBars;
...
FooBar GetOrCreate(String key)
{
FooBar fooBar;
if (!fooBars.TryGetValue(key, out fooBar))
{
fooBar = new FooBar();
fooBars.Add(key, fooBar);
}
return fooBar;
}
}
Run Code Online (Sandbox Code Playgroud)
它有任何确定的名称吗?
(是的,它是用C#编写的,但它可以"轻松"转移到C++.因此该标签.)
鉴于我需要在结构中存储"泛型"指针的值并且对指向的内存本身没有兴趣,我发现将它存储为intptr_t比a 更为语义正确void*.问题是a uintptr_t是否更适合,并且当一个人更喜欢另一个人时?
鉴于一个类实际上是可移动的,手动实现移动构造函数和移动类的赋值运算符很快变得乏味.
我想知道什么时候这样做实际上是一个沉重,沉重,过早的优化?
例如,如果一个类只有普通的POD数据或者它们自己有移动构造函数和移动赋值运算符定义的成员,那么我猜测编译器将只是优化该批次的狗屎(在POD的情况下)和否则使用成员的移动构造函数和移动赋值运算符.
但这有保证吗?在什么情况下,我应该想到明确需要实现一个移动构造函数和移动赋值操作符?
编辑:正如他在回答评论下面提到的尼科尔流星锤/sf/answers/697627381/,与Visual Studio 11 Beta版(之前)没有转移构造函数或移动赋值操作符是不断自动生成.参考:http://blogs.msdn.com/b/vcblog/archive/2011/09/12/10209291.aspx
考虑从函数返回启用了移动语义的"整个"对象的情况,如std::basic_string<>:
std::wstring build_report() const
{
std::wstring report;
...
return report;
}
Run Code Online (Sandbox Code Playgroud)
然后我可以真实地期望做出"最佳"选择是否使用带有移动语义的返回字符串,如
const std::wstring report(std::move(build_report()));
Run Code Online (Sandbox Code Playgroud)
或者我是否应该依赖(N)RVO来进行
const std::wstring report(build_report());
Run Code Online (Sandbox Code Playgroud)
甚至将const引用绑定到临时用
const std::wstring& report(build_report());
Run Code Online (Sandbox Code Playgroud)
有什么方案可以确定性地选择这些选项,如果有的话?
编辑1:请注意,std::wstring上面的用法只是移动语义启用类型的一个示例.它也可以换成你的arbitrary_large_structure.:-)
编辑2:我在VS 2010中运行以下速度优化版本时检查生成的程序集:
std::wstring build_report(const std::wstring& title, const std::wstring& content)
{
std::wstring report;
report.append(title);
report.append(content);
return report;
}
const std::wstring title1(L"title1");
const std::wstring content1(L"content1");
const std::wstring title2(L"title2");
const std::wstring content2(L"content2");
const std::wstring title3(L"title3");
const std::wstring content3(L"content3");
int _tmain(int argc, _TCHAR* argv[])
{
const std::wstring report1(std::move(build_report(title1, content1)));
const std::wstring …Run Code Online (Sandbox Code Playgroud) 识别字符串(是或)是否可能是UTF-8编码的最佳方法是什么?Win32 API IsTextUnicode在这里没有多大帮助.此外,该字符串将不具有UTF-8 BOM,因此无法检查.并且,是的,我知道只有ASCII范围以上的字符才会被编码超过1个字节.
我们正在使用
std::wstring_convert<std::codecvt_utf8_utf16<wchar_t>> converter;
Run Code Online (Sandbox Code Playgroud)
在我们的记录器中,从遗留组件获取UTF-16字符串并将其转换为我们写入日志的UTF-8.转换器在每次转换时都会被实例化,我们就这样做了
auto utf8string = converter.to_bytes(utf16string);
Run Code Online (Sandbox Code Playgroud)
这是在我们代码的一个相当密集和多线程的部分完成的,我想重用一个转换器的实例,但是seing std::wstring_convert暴露了一个"状态",我担心这to_bytes不是线程安全的通过重用相同的实例可以获得的收益会因为需要过多的锁定而丢失(在这种情况下我不会共享实例).
那么,std::wstring_convert<>::to_bytes线程安全吗?
编辑:澄清我真正的问题:给定一个实例std::wstring_convert<>,如果2个或更多线程同时to_bytes使用不同的参数调用该实例,to_bytes那么保证表现良好吗?
我似乎在精神上陷入了Flyweight模式的困境.
首先,假设我有一次性用品DisposableFiddle和工厂FiddleFactory:
public interface DisposableFiddle : IDisposable
{
// Implements IDisposable
}
public class FiddleFactory
{
public DisposableFiddle CreateFiddle(SomethingThatDifferentiatesFiddles s)
{
// returns a newly created fiddle.
}
}
Run Code Online (Sandbox Code Playgroud)
然后,在我看来,客户很清楚FiddleFactory工厂声称没有创建小提琴的所有权,并且客户有责任在完成它时处理小提琴.
但是,让我们说我想通过使用Flyweight模式在客户端之间共享小提琴:
public class FiddleFactory
{
private Dictionary<SomethingThatDifferentiatesFiddles, DisposableFiddle> fiddles = new ...;
public DisposableFiddle CreateFiddle(SomethingThatDifferentiatesFiddles s)
{
// returns an existing fiddle if a corresponding s is found,
// or a newly created fiddle, after adding it to the dictionary,
// if no corresponding …Run Code Online (Sandbox Code Playgroud) 管道中有一些基于Linux的C++项目.我应该选择哪种IDE与某种"智能感知器"(即没有Visual Assist类固醇)相比具有某种"智能感知",或者更好.
(请注意,我没有使用"尽可能好或更好"的字样.我认为Visual Studio C++智能感知一切都很好,因此"与...相提并论"和Visual Assist评论).
假设我有这两个重载:
void Log(const wchar_t* message)
{
// Do something
}
void Log(const std::wstring& message)
{
// Do something
}
Run Code Online (Sandbox Code Playgroud)
我可以在第一个函数中添加一些编译时验证,传递的参数是字符串文字吗?
编辑:澄清为什么这对我来说是好的; 我当前的高频日志记录仅使用字符串文字,因此在存在非堆分配保证时可以进行大量优化.第二次重载今天不存在,但我可能想添加它,但后来我想保留第一个用于极端场景.:)