小编Mic*_*eyn的帖子

如何在64位C++代码中使用暂停汇编指令?

由于VC++ 2010在64位代码中不支持内联汇编,因此如何在代码中获取pausex86-64指令?像有许多其他常见的汇编指令(例如,似乎没有成为一个内在此__rdtsc(),__cpuid()等...).

在为什么一面,我希望在指令帮助忙等待的使用情况,从而使(超线程)的CPU可用来上运行的其他线程CPU说(见:成效分析在intel.com).该pause指令对于此用例以及自旋锁实现非常有用,我无法理解为什么MS不将其作为内在包含.

谢谢

visual-c++ visual-c++-2010

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

声明与定义

在C#中,声明与定义有何不同,即:

  1. 类声明与类定义
  2. 变量声明与定义
  3. 方法参数声明与定义

在C++中,这是相当明显的,但在C#中我从ECMA标准和MSDN中可以看出,一切都是声明,并且在使用单词定义时,它用于表示与声明相同的内容.

.net c#

11
推荐指数
4
解决办法
9980
查看次数

在INSERT之后使用OUTPUT将identity列的值转换为(非表值)变量

给出以下简单的测试表:

CREATE TABLE dbo.Test
(
  Id bigint IDENTITY(1,1) NOT NULL,
  Name varchar(50) NULL
)
Run Code Online (Sandbox Code Playgroud)

我想在INSERT使用OUTPUT子句后将标识列的值转换为标量变量,但这不起作用:

DECLARE @InsertedId BIGINT;

INSERT INTO Test(Name) 
  OUTPUT @InsertedId=inserted.Id
  VALUES ('Michael')

-- Display resulting id for debugging
SELECT @InsertedId;
-- ...
Run Code Online (Sandbox Code Playgroud)

我知道我可以轻松地使用SCOPE_IDENTITY()之后使用INSERT,但是可以INSERT使用该OUTPUT子句作为语句的一部分而不使用表变量吗?

更新,另一个人为的尝试也是不合法的:

-- Return the id as a result set
INSERT INTO Test(Name) 
OUTPUT inserted.Id AS TheId
VALUES ('Michael')

-- But you can't use the result set as a derived table...
SELECT …
Run Code Online (Sandbox Code Playgroud)

t-sql sql-server-2008 sql-server-2008-r2

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

在Aero上覆盖WPF中的按钮背景

因此,希望很简单,将按钮的背景更改为LightGreen,当鼠标光标悬停在其上时为绿色,按下时将DarkGreen更改为DarkGreen.以下XAML是我的第一次尝试:

<Window x:Class="ButtonMouseOver.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
  <Grid>
    <Button Background="LightGreen">
      Hello
      <Button.Style>
        <Style TargetType="Button">
          <Style.Triggers>
            <Trigger Property="IsMouseOver" Value="true">
              <Setter Property = "Background" Value="Green"/>
            </Trigger>
            <Trigger Property="IsPressed" Value="true">
              <Setter Property = "Foreground" Value="DarkGreen"/>
            </Trigger>
          </Style.Triggers>
        </Style>
      </Button.Style>
    </Button>
  </Grid>
</Window>
Run Code Online (Sandbox Code Playgroud)

但是,唉,这不起作用.我们只是实现目标的1/3.是的,按钮变为浅绿色,但只要将鼠标悬停在按钮上或按下它,您就可以获得相应按钮状态的标准Aero镀铬.不想放弃,我尝试以下放荡:

...
    <Button xmlns:Microsoft_Windows_Themes="clr-namespace:Microsoft.Windows.Themes;assembly=PresentationFramework.Aero"
            Background="LightGreen">
      Hello
      <Button.Template>
        <ControlTemplate TargetType="{x:Type Button}">
          <Microsoft_Windows_Themes:ButtonChrome SnapsToDevicePixels="true" 
            x:Name="Chrome" Background="{TemplateBinding Background}" 
            BorderBrush="{TemplateBinding BorderBrush}" RenderDefaulted="{TemplateBinding IsDefaulted}" 
            RenderMouseOver="{TemplateBinding IsMouseOver}" RenderPressed="{TemplateBinding IsPressed}"
            >
            <ContentPresenter Margin="{TemplateBinding Padding}"
                                          VerticalAlignment="{TemplateBinding VerticalContentAlignment}"
                                          HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"
                                          RecognizesAccessKey="True"
                                          SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"/>
          </Microsoft_Windows_Themes:ButtonChrome>
        </ControlTemplate>
      </Button.Template>
      <Button.Style>
        <Style TargetType="Button"> …
Run Code Online (Sandbox Code Playgroud)

c# wpf wpf-controls wpf-4.0 c#-4.0

9
推荐指数
1
解决办法
9303
查看次数

删除WPF DataGrid标题列的左边框网格线以匹配数据网格线

WPF 4.0 DataGrid中标题单元格和数据单元格的边框样式不一致.标题单元格的边框包含左侧垂直边框线和标题文本周围的右侧垂直边框线.数据网格文本列数据行的样式使得只有右侧具有垂直边界线.以下示例图像说明了这一点(请注意,网格线颜色已更改为#D0D0D0):

在此输入图像描述

以下是放大显示不一致性的相同图像:

在此输入图像描述

如何更改网格标题(可能通过模板或样式)以删除左边框,以便标题垂直边框线与数据边框线对齐?

wpf wpf-controls wpfdatagrid

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

并行计算大文件的哈希码

我想提高哈希大文件的性能,例如数十亿字节.

通常,您使用散列函数依次散列文件的字节(例如,SHA-256,尽管我很可能会使用Skein,因此与从[来自[]读取文件所花费的时间相比,散列会更慢.快] SSD).我们称之为方法1.

这个想法是在8个CPU上并行地散列文件的多个1 MB块,然后将连接的散列散列为单个最终散列.我们称之为方法2.

描绘此方法的图片如下:


在此输入图像描述


我想知道这个想法是否合理,以及在整个文件的跨度上执行单个散列时,失去了多少"安全性"(就碰撞而言更可能).

例如:

让我们使用SHA-2的SHA-256变体,并将文件大小设置为2 ^ 34 = 34,359,738,368字节.因此,使用简单的单一传递(方法1),我将获得整个文件的256位哈希.

比较这个:

使用并行散列(即方法2),我会将文件分成32,768个1 MB的块,使用SHA-256将这些块散列为32,768个256位(32字节)的哈希值,连接哈希值并进行最终哈希结果连接的1,048,576字节数据集,以获得整个文件的最终256位哈希值.

方法2是否比方法1更不安全,因为碰撞更可能和/或可能?也许我应该将这个问题重新解释为:方法2是否使攻击者更容易创建一个哈希值与原始文件相同的哈希值的文件,当然除了蛮力攻击因此更便宜的琐碎事实. hash可以在N cpus上并行计算?

更新:我刚刚发现方法2中的构造非常类似于哈希列表的概念.然而,与方法1相比,前一句中链接引用的维基百科文章没有详细说明哈希列表在冲突机会方面的优势或劣势,方法1是文件的普通旧哈希,只有顶部哈希使用哈希列表.

hash cryptography sha256 sha2

9
推荐指数
2
解决办法
9206
查看次数

如何在x64代码中获取exp()函数的内在函数?

我有以下代码,并期望使用函数的内在版本exp().不幸的是,它不是在x64版本中,使其比类似的Win32(即32位版本)慢:

#include "stdafx.h"
#include <cmath>
#include <intrin.h>
#include <iostream>

int main()
{
  const int NUM_ITERATIONS=10000000;
  double expNum=0.00001;
  double result=0.0;

  for (double i=0;i<NUM_ITERATIONS;++i)
  {
    result+=exp(expNum); // <-- The code of interest is here
    expNum+=0.00001;
  }

  // To prevent the above from getting optimized out...
  std::cout << result << '\n';
}
Run Code Online (Sandbox Code Playgroud)

我正在使用以下开关进行构建:

/Zi /nologo /W3 /WX-
/Ox /Ob2 /Oi /Ot /Oy /GL /D "WIN32" /D "NDEBUG" 
/D "_CONSOLE" /D "_UNICODE" /D "UNICODE" /Gm- 
/EHsc /GS /Gy /arch:SSE2 /fp:fast /Zc:wchar_t /Zc:forScope …
Run Code Online (Sandbox Code Playgroud)

c++ visual-studio-2010 intrinsics visual-c++ visual-c++-2010

9
推荐指数
1
解决办法
2589
查看次数

如何将正则表达式中的变量插值延迟到使用点?

例如,让我们假设我有一组变量和一组插入这些变量的正则表达式:

my ($var1, $var2, $var3);
my @search_regexes=(
  qr/foo $var1/,
  qr/foo bar $var2/,
  qr/foo bar baz $var3/,
);
Run Code Online (Sandbox Code Playgroud)

上面的代码将给我们警告告诉我们$var1,$var2并且$var3没有在正则表达式编译中为正则表达式定义$search_regexes.但是,我想在这些正则表达式中延迟变量插值,直到实际使用它们为止(或者在变量具有值后稍后(重新)编译):

# Later on we assign a value to $var1 and search for the first regex in $_ ...
$var1='Hello';
if (/$search_regexes[0]/)
{
  # Do something ...
}
Run Code Online (Sandbox Code Playgroud)

我将如何在初始代码示例中重构构造以实现此目的?

作为奖励,我想在将值分配给该正则表达式中出现的相应变量之后编译每个正则表达式,其方式与qr//操作员现在所做的相同(但为时太早).如果您可以展示如何进一步扩展解决方案以实现这一点,我将非常感激.

更新:

我已经确定了Hunter方法的变体,因为使用它我不会受到性能影响,并且对现有代码的修改很少.其他答案也教会了我很多关于这个问题的替代解决方案及其在需要匹配很多行时的性能影响.我的代码现在类似于以下内容:

my ($var1, $var2, $var3);
my @search_regexes=(
  sub {qr/foo $var1/},
  sub {qr/foo bar $var2/},
  sub {qr/foo bar baz $var3/},
);

...
($var1,$var2,$var3)=qw(Hello …
Run Code Online (Sandbox Code Playgroud)

regex perl

9
推荐指数
2
解决办法
498
查看次数

使用命名参数调用内联TVF,正确的语法是什么?

我尝试使用位置参数调用内联TVF并且它工作正常:

SELECT MyTable.Col1,
       (SELECT TvfColumn FROM ufnGetData(MyTable.Col1, MyTable.Col2)),
       MyTable.Col2
FROM MyTable
Run Code Online (Sandbox Code Playgroud)

然后我尝试将参数命名为TVF并且它不解析:

SELECT MyTable.Col1,
       (SELECT TvfColumn FROM ufnGetData(@Param1=MyTable.Col1, @Param2=MyTable.Col2)),
       MyTable.Col2
FROM MyTable
Run Code Online (Sandbox Code Playgroud)

该函数看起来像:

CREATE FUNCTION dbo.ufnGetData
(   
    @Param1 INT,
    @Param2 INT
)
RETURNS TABLE 
AS
RETURN 
(
SELECT 
       blah blah blah AS TvfColumn
)
GO
Run Code Online (Sandbox Code Playgroud)

给出类似于的错误:

消息137,级别15,状态2,行23必须声明标量变量"@Param2".

消息102,级别15,状态1,行24','附近的语法不正确.

我究竟做错了什么?

t-sql sql-server-2008 sql-server-2008-r2

8
推荐指数
1
解决办法
2568
查看次数

用于查找的C#最佳IDictionary用法,可能未找到

假设我有一个方法如下:

internal MyClass GetValue(long key)
{
  if (_myDictionary.ContainsKey(key))
    return _myDictionary[key];

  return null; // Not found
}

IDictionary<long,MyClass> _myDictionary=...
Run Code Online (Sandbox Code Playgroud)

但是上面的代码在字典中有两个查找:

  1. 关键的存在的测试
  2. 实际检索的值

是否有更优化的方式来表达这样的函数,因此只执行一次查找,但"未找到"的情况仍然通过空返回处理(即,不通过未找到的异常)?

例如,如果对键的查找返回某种可用于检索值的迭代器或者如果未在C++中找到该值而找到无效迭代器,则会很好.考虑到语言特性,C#可能有更好的方法.

.net c# .net-4.0 c#-4.0

8
推荐指数
1
解决办法
467
查看次数