小编hal*_*ton的帖子

在未经调试的情况下捕获托管代码中的第一次机会异常

有没有办法捕获First-Chance异常,并记录它们而不在调试器下运行?

我想另一种问这个问题的方法是,我可以编写一些东西,它会像调试器一样附加到我的进程中,看看它发生了什么问题吗?

c# debugging clr

5
推荐指数
1
解决办法
1660
查看次数

MSIL - 给定一个整数,调用操作码如何知道调用什么方法

我试图弄清楚 MSIL 如何能够通过仅存储一个整数来表示对静态函数的调用。

例如,如果您添加对 Interlocked.Increment(ref someVariable) 的调用,您的 IL 将包含以下内容:

0x28 | 0x12、0x0、0x0、0xA

管道运算符是我的补充,本质上 0x28 是调用指令,而 012, 0x0, 0x0, 0xA 是“Interlocked.Increment”方法。

谁决定了这个价值?当您使用 ildasm 进行反汇编时,它会很好地打印名称,但是否有它查找的表?

这个表是在哪里定义的?

c# clr cil

5
推荐指数
1
解决办法
518
查看次数

C# - new()约束的泛型如何生成机器代码?

public T Foo<T, U>(U thing) where T : new()
{
    return new T();
}
Run Code Online (Sandbox Code Playgroud)

当没有new()约束时,我理解它是如何工作的.JIT编译器看到T,如果它是引用类型,则使用代码的对象版本,并专门针对每个值类型的情况.

如果你有一个新的T(),它是如何工作的?它在哪里寻找?

c# generics clr

5
推荐指数
1
解决办法
91
查看次数

我如何知道我的程序运行在哪个版本的.NET Framework上?

我有一个程序,我认为它在.NET 4.0中运行,但我无法进行混合模式调试(对于64位应用程序,新的.net 4.0)

我想确认我是否真的在.NET 4.0中运行,或者它是否运行.NET 3.5

有没有办法查看内存空间或其他什么?

.net clr

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

C#将相同的函数应用于不同的变量

string.Format("{0}, {1}, {2}", var1, var2, var3)
Run Code Online (Sandbox Code Playgroud)

我想对var1,var2和var3中的每一个应用URL编码.它不是一个数组,所以我不能使用Linq Aggregate来完成它.

有任何想法吗?

我不想在每个变量周围加上括号.

c# linq

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

使用反应式扩展(rx)枚举及时发生的事件

 public interface Event
 {
      Guid identifier;
      Timestamp ts;
 }
Run Code Online (Sandbox Code Playgroud)

我们正在考虑使用Reactive Extensions来重写我的金融公司的问题.

前提是我们通过Guid(股票代码+嵌入其中的唯一性熵),时间戳和值字段来识别事件.它们的速度很快,我们不能在X秒(10秒)后"至少"之前对这些物体采取行动,之后我们必须对它们采取行动,然后将它们从系统中移除.

想想它就像两个窗口,一个"10秒"的初始窗口(例如T0到T10),我们在那里识别所有独特的事件(基本上是guid组),然后我们查看下一个"10秒","辅助窗口"(T10-T20),以确保我们实施"至少"10秒的政策.从"初始窗口",我们删除所有事件(因为我们已经考虑了它们),然后从"辅助窗口"中删除"初始窗口"中发生的事件.我们继续移动10秒推拉窗,所以现在我们正在看窗口T20-T30,重复并冲洗.

我怎么能在Rx中实现它,因为它似乎是要走的路.

.net c# system.reactive

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

C# - 检查一个bool值,然后翻转它

for (int i = 0; i < X; i++)
   myitem = (checkedDB) ? dirtyItem : cleanItem;
Run Code Online (Sandbox Code Playgroud)

我想知道是否有一种在同一语句中翻转checkedDB的方法,即下一次迭代checkedDB与它的值相反,所以就像XORing一样.

c# xor

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

在进行网络I/O时是否缓冲了Stream.Read?

所以我最近做了一些工作,当有人告诉我,如果在Stream.Read网络流上做一个通过调用.NET GetResponseStream上的一个WebResponse或者那些被缓冲的.

他说如果你要在你正在阅读的代码中设置一个断点,你就不会停止网络流量.我发现这很奇怪,但也希望这是真的.这是如何运作的?它甚至准确吗?

using (Stream webResponseStream = this.webResponse.GetResponseStream())
{
   byte[] readBuffer = new byte[bufferSize];
   int bytesRead = webResponseStream.Read(readBuffer, 0, bufferSize);
   while (bytesRead > 0)
   {
        bytesRead = webResponseStream.Read(readBuffer, 0, bufferSize);
        // If I put a breakpoint here, does network activity stop?
   }
}
Run Code Online (Sandbox Code Playgroud)

c# io network-protocols stream buffered

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

C++ - char**作为函数参数传入,它应该是调用者分配还是被调用者?

如果我有如下功能:

 bool MyFunc(char **outMessage)
 {
 }
Run Code Online (Sandbox Code Playgroud)

这里有什么期望?调用者是否会分配缓冲区并传递给被调用方?但那么如果被调用者超过缓冲区怎么办?

要明确你没有大小或任何其他参数,这是函数定义.你怎么看?

或者我错了吗?这是被调用者分配的缓冲区?但如果它是被调用者分配的缓冲区,我该如何处理缓冲区呢?注意:没有功能可以处理库提供的功能.

编辑:这是一个真实的场景,取自这里 - > http://llvm.org/docs/doxygen/html/Analysis_2Analysis_8cpp_source.html#l00078

c++ pointers

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

通过 avx 指令向量化间接访问

我最近被介绍了向量指令(理论上)并且对如何使用它们来加速我的应用程序感到兴奋。

我想改进的一个方面是一个非常热的循环:

__declspec(noinline) void pleaseVectorize(int* arr, int* someGlobalArray, int* output)
{
    for (int i = 0; i < 16; ++i)
    {
        auto someIndex = arr[i];
        output[i] = someGlobalArray[someIndex];
    }

    for (int i = 0; i < 16; ++i)
    {
         if (output[i] == 1)
         {
             return i;
         }
    }

    return -1;
}
Run Code Online (Sandbox Code Playgroud)

但是,当然,所有 3 个主要编译器(msvc、gcc、clang)都拒绝对此进行矢量化。我可以理解为什么,但我想得到确认。

如果我必须手动矢量化它,它将是:

(1) VectorLoad "arr", 这带来了 16 个 4 字节整数,让我们说到 zmm0

(2) 16个内存从zmm0[0..3]指向的地址加载到zmm1[0..3],从zmm0[4..7]指向的地址加载到zmm1[4..7]所以等等

(3)比较zmm0和zmm1

(4) 向量 popcnt 到输出中找出最高有效位并基本上除以 8 得到匹配的索引

首先,向量指令可以做这些事情吗?就像他们可以执行这种“收集”操作,即从指向 zmm0 的地址加载?

以下是 clang 生成的内容:

0000000000400530 …
Run Code Online (Sandbox Code Playgroud)

c++ simd vectorization compiler-optimization avx512

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