现在std有一个真正的哈希映射unordered_map,为什么(或何时)我还想在它实际存在的系统上使用旧的mapover unordered_map?是否有任何我无法立即看到的明显情况?
我经常在C++中使用的东西是让一个类通过构造函数和析构函数A处理另一个类的状态入口和退出条件,以确保如果该范围内的某些东西抛出异常,那么B将具有已知状态范围已退出.就首字母缩略词而言,这不是纯粹的RAII,但它仍然是一种既定的模式.BA
在C#中,我经常想做
class FrobbleManager
{
...
private void FiddleTheFrobble()
{
this.Frobble.Unlock();
Foo(); // Can throw
this.Frobble.Fiddle(); // Can throw
Bar(); // Can throw
this.Frobble.Lock();
}
}
Run Code Online (Sandbox Code Playgroud)
这需要像这样做
private void FiddleTheFrobble()
{
this.Frobble.Unlock();
try
{
Foo(); // Can throw
this.Frobble.Fiddle(); // Can throw
Bar(); // Can throw
}
finally
{
this.Frobble.Lock();
}
}
Run Code Online (Sandbox Code Playgroud)
如果我想保证退货Frobble时的状态FiddleTheFrobble.代码会更好
private void FiddleTheFrobble()
{
using (var janitor = new FrobbleJanitor(this.Frobble))
{
Foo(); // Can throw
this.Frobble.Fiddle(); // Can throw …Run Code Online (Sandbox Code Playgroud) 注意:我不是在扮演魔鬼的拥护者或类似的东西 - 我只是真的好奇,因为我自己不在这个营地.
标准库中的大多数类型都具有可以抛出异常的变异函数(例如,如果内存分配失败)或者可以抛出异常的非变异函数(例如,超出边界的索引访问器).除此之外,许多自由函数可以抛出异常(例如operator new和dynamic_cast<T&>).
你如何在"我们不使用例外"的背景下实际处理这个问题?
你是否试图永远不会调用可以投掷的功能?(我无法看到它的规模如何,所以如果是这种情况,我很想知道你是如何实现这一目标的)
你没事吧和标准库中投掷,你把"我们不使用异常"为"我们从来不扔的异常我们的代码,我们从来没有赶上从异常等的代码"?
您是否通过编译器开关完全禁用异常处理?如果是这样,标准库的异常抛出部分如何工作?
编辑您的构造函数,它们是否会失败,或者按照惯例使用具有专用init函数的两步构造,该函数可以在失败时返回错误代码(构造函数不能),或者您是否执行其他操作?
编辑在问题开始后1周进行了一些小的澄清......下面的评论和问题中的大部分内容都集中在为什么方面的例外与"别的东西".我的兴趣是不是在这,但是当你选择做"别的东西",如何你处理标准库部件是不抛出异常?
for(auto& entity : memoryManager.getItems()) entity->update(mFrameTime);
Run Code Online (Sandbox Code Playgroud)
如果memoryManager包含1000个项目,那么memoryManager.getItems()在循环开始时会调用1000次还是只调用一次?
编译器是否使用-O2(或-O3)运行任何优化?
(memoryManager.getItems()返回std::vector<Entity*>&)
假设出于调试目的,我希望快速将IEnumerable的内容转换为单行字符串,每个字符串项以逗号分隔.我可以使用foreach循环在辅助方法中完成它,但这既不好玩也不简短.可以使用Linq吗?其他一些短途的方式?
灵感来自c/c ++中初始化和归零数组的问题?在我的例子中,我决定实际检查一下针对Windows Mobile Professional(ARM处理器,来自Microsoft Optimizing Compiler)的优化发布版本.我发现的有点令人惊讶,我想知道是否有人可以解释我的问题.
检查这两个例子:
byte a[10] = { 0 };
byte b[10];
memset(b, 0, sizeof(b));
Run Code Online (Sandbox Code Playgroud)
它们在同一个函数中使用,因此堆栈如下所示:
[ ] // padding byte to reach DWORD boundary
[ ] // padding byte to reach DWORD boundary
[ ] // b[9] (last element of b)
[ ]
[ ]
[ ]
[ ]
[ ]
[ ]
[ ]
[ ]
[ ] // b[0] = sp + 12 (stack pointer + 12 bytes)
[ ] …Run Code Online (Sandbox Code Playgroud) 在C++ 11中迭代容器的推荐方法是什么?
运用
container.begin() and container.end()
Run Code Online (Sandbox Code Playgroud)
要么
begin(container) and end(container)
Run Code Online (Sandbox Code Playgroud)
如果有的话,何时优先于另一个?
我认为我正在观察.NET JIT编译器没有内联或优化对没有副作用的空静态方法的调用,考虑到一些直言不讳的在线资源,这有点令人惊讶.
我的环境是x64,Windows 8.1,.NET Framework 4.5上的Visual Studio 2013.
鉴于这个简单的测试程序(https://ideone.com/2BRCpC)
class Program
{
static void EmptyBody()
{
}
static void Main()
{
EmptyBody();
}
}
Run Code Online (Sandbox Code Playgroud)
发布版本与上述程序的最优化产生以下MSIL为Main和EmptyBody:
.method private hidebysig static void Main() cil managed
{
.entrypoint
// Code size 6 (0x6)
.maxstack 8
IL_0000: call void Program::EmptyBody()
IL_0005: ret
} // end of method Program::Main
.method private hidebysig static void EmptyBody() cil managed
{
// Code size 1 (0x1)
.maxstack 8
IL_0000: ret
} // …Run Code Online (Sandbox Code Playgroud) 在查看双重检查锁定时,我看到了许多建议,只是跳过第一次检查并立即进行锁定,然后检查后再进行检查.
这让我想知道,什么时候是lock (this.padlock)"便宜"的?