小编Rom*_*kov的帖子

为什么SortedList实现使用ThrowHelper而不是直接抛出?

Reflector告诉我,SortedList使用ThrowHelper类来抛出异常而不是直接抛出它们,例如:

public TValue this[TKey key]
{
    get
    {
        int index = this.IndexOfKey(key);
        if (index >= 0)
            return this.values[index];
        ThrowHelper.ThrowKeyNotFoundException();
        return default(TValue);
    }
Run Code Online (Sandbox Code Playgroud)

其中ThrowKeyNotFoundException仅执行以下操作:

throw new KeyNotFoundException();
Run Code Online (Sandbox Code Playgroud)

注意这需要一个duff语句"return default(TValue)",它是无法访问的.我必须得出结论,这种模式的好处足以证明这一点.

这些好处是什么?

c#

13
推荐指数
1
解决办法
1798
查看次数

为什么_CrtSetBreakAlloc不会导致断点?

我正在使用Visual CRT的内存泄漏检测程序<crtdbg.h>; 当我调用_CrtDumpMemoryLeaks一个分配时,会在每次调用程序时一致地报告:

{133} normal block at 0x04F85628, 56 bytes long.
 Data: <                > B0 81 F8 04 B0 81 F8 04 B0 81 F8 04 CD CD CD CD 
Run Code Online (Sandbox Code Playgroud)

地址各不相同,但{133}始终相同.

根据MSDN关于如何在内存分配编号上设置断点的说明,我应该能够通过此调用在第133次分配上设置断点:

_CrtSetBreakAlloc(133);
Run Code Online (Sandbox Code Playgroud)

我还可以在监视窗口中验证{,,msvcr90d.dll}_crtBreakAlloc确实设置为133.程序退出后,泄漏报告仍然列出#133(以及一些更高的数字),但不会发生断点.为什么会这样,我如何让断点发生?

潜在相关信息:

  1. VS2008,使用"多线程调试DLL"CRT
  2. 我的代码是由第三方产品加载的DLL
  3. "正常"断点工作正常; 踩踏工作正常; __asm int 3工作得很好.
  4. 没有其他值_crtBreakAlloc导致断点(不是我试过的那些)
  5. 133是泄漏报告中的最小数字

memory-leaks msvcrt crtdbg.h visual-c++

13
推荐指数
1
解决办法
5468
查看次数

DrawingVisual与Canvas.OnRender的性能,适用于许多不断变化的形状

我正在开发一款类似游戏的应用程序,它有多达千种形状(椭圆和线条),不断变换为60fps.阅读了一篇关于渲染许多移动形状优秀文章后,我使用自定义Canvas后代实现了这一点,该后代覆盖OnRender了通过a进行绘制DrawingContext.虽然CPU使用率很高,但性能非常合理.

然而,文章表明,不断移动形状的最有效方法是使用大量DrawingVisual实例而不是OnRender.不幸的是,虽然它没有解释为什么在这种情况下应该更快.

以这种方式改变实现并不是一件小事,所以我想在决定进行切换之前了解原因以及它们是否适用于我.为什么这种DrawingVisual方法会导致CPU使用率低OnRender于此方案中的方法?

wpf performance

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

13
推荐指数
1
解决办法
111
查看次数

线程有什么实际的替代品吗?

在阅读SQLite时,我在FAQ中偶然发现了这句话:"线程是邪恶的.避免使用它们."

我非常尊重SQLite,所以我不能忽视这一点.根据"避免他们"政策,我想到了我还能做什么,而是使用它来平行我的任务.例如,我目前正在处理的应用程序需要一个始终响应的用户界面,并且需要不时地轮询多个网站(每个网站至少需要30秒).

所以我打开了从常见问题解答链接的PDF,基本上似乎本文提出了几种与线程一起应用的技术,例如障碍或事务性内存 - 而不是任何完全替换线程的技术.

Given that these techniques do not fully dispense with threads (unless I misunderstood what the paper is saying), I can see two options: either the SQLite FAQ does not literally mean what it says, or there exist practical approaches that actually avoid the use of threads altogether. Are there any?


Just a quick note on tasklets/cooperative scheduling as an alternative - this looks great in small examples, but I wonder whether a …

language-agnostic multithreading thread-safety

12
推荐指数
2
解决办法
3805
查看次数

你如何保护自己免受失控的内存消耗降低PC?

我一次又一次地发现自己做了一些中度愚蠢的事情,导致我的程序分配了它可以获得的所有内存,然后是一些.

这种事情曾经导致程序因"内存不足"错误而很快死亡,但是现在Windows会不顾一切地将这种不存在的内存提供给应用程序,事实上显然已经准备好自杀这样做.当然不是字面意思,但它会使可用的物理RAM匮乏如此严重,甚至运行任务管理器将需要半小时的交换(在所有失控的应用程序仍在分配越来越多的内存之后).

这种情况不会经常发生,但是当它发生时却是灾难性的.我通常不得不重置我的机器,导致数据不时丢失并且通常会带来很多不便.

你是否有任何关于使这种错误的后果不那么可怕的实用建议?也许某些注册表调整限制允许应用程序分配的最大虚拟内存量?或者某些CLR标志仅限于当前应用程序?(我通常在.NET中对自己这样做.)

("不要耗尽RAM""购买更多RAM"是没有用的 - 前者我无法控制,后者我已经完成了.)

.net windows clr

12
推荐指数
2
解决办法
525
查看次数

逐步完成Visual Studio中的"托管到本机转换"?

在尝试回答这个问题时,我决定在调试器视图中手动逐步完成编组过程.

不幸的是,Visual Studio似乎跳过了所有这些有趣的代码.这是对GetProfilesDirectory(WinAPI函数)的P/Invoke调用:

在此输入图像描述

但是在接到这个电话(F11)后,我发现自己并没有FFF9BFD8; 相反,我在GetProfilesDirectory代码中着陆:

在此输入图像描述

[Managed to Native Transition]堆栈上还有条目,暗示Visual Studio刚刚跳过一大堆代码.

我该如何逐步完成这一过渡?

.net pinvoke native marshalling visual-studio

12
推荐指数
1
解决办法
3814
查看次数

Visual Studio认为"用户代码"是什么?

假设我有一个抛出异常的函数.假设此函数由第三方DLL调用,第三方DLL将处理我抛出的异常.

如果Visual Studio决定第三方DLL不是"用户代码"(如下图所示),那么默认情况下它将在我的异常中停止,即使它稍后处理.这样做并非完全错误 ; 它清楚地解释了用户代码未处理异常.但是,是什么让Visual Studio将一些DLL称为"用户代码"而其他人不是?

在此输入图像描述

我有一个理论认为这是因为没有加载符号,但是列表中的模块已经加载了符号,但仍然不被视为"用户代码".

debugging visual-studio-2010 visual-studio-debugging

12
推荐指数
1
解决办法
2674
查看次数

const字段的复杂初始化

考虑像这样的一个类:

class MyReferenceClass
{
public:
    MyReferenceClass();
    const double ImportantConstant1;
    const double ImportantConstant2;
    const double ImportantConstant3;
private:
    void ComputeImportantConstants(double *out_const1, double *out_const2, double *out_const3);
}
Run Code Online (Sandbox Code Playgroud)

有一个例程(ComputeImportantConstants)在运行时计算三个常量.假设计算相当复杂,并且固有地一次产生所有三个值.此外,结果取决于构建配置,因此硬编码结果不是一种选择.

有没有一种合理的方法将这些计算值存储在类的相应const双字段中?

如果没有,你能建议一种更自然的方式在C++中声明这样的类吗?

在C#中,我会在这里使用带有静态构造函数的静态类,但这不是C++中的一个选项.我也考虑过使用非const字段或函数调用使ImportantConstant1..3,但两者都显得逊色.

我发现初始化const字段的唯一方法是使用初始化列表,但似乎不可能在这样的列表中传递多输出计算的结果.

c++ initialization const ctor-initializer

11
推荐指数
2
解决办法
2095
查看次数

什么是单个"1"位的SHA-256哈希?

SHA-256的定义似乎是由单个"1"位组成的输入具有明确定义的散列值,不同于"01" 字节的散列值(因为填充是基于输入的位长度完成的).

但是,由于字节序问题以及我找不到支持单个位的实现这一事实,我无法弄清楚这个正确的值是什么.

那么,由位"1"组成的1位长输入的正确散列是什么?(不是8位长字节[] {1}输入).

language-agnostic algorithm hash sha

11
推荐指数
1
解决办法
1881
查看次数