小编Mar*_* Ba的帖子

使用交替或字符类进行单字符匹配?

(注意:标题似乎并不清楚 - 如果有人可以改写,我就是全部!)

鉴于这个正则表达式:(.*_e\.txt),它匹配一些文件名,我需要添加一些其他单字符后缀除了e.我应该选择一个角色类还是应该使用替换?(或者这真的很重要??)

也就是说,以下哪两个似乎"更好",以及为什么:

a)(.*(e|f|x)\.txt),或

b) (.*[efx]\.txt)

regex perl

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

Windows + VisualC上是否有易失性读写原子?

有一对夫妇在这个网站,询问使用是否问题volatile变量原子/多线程访问是可能的:见这里,这里,还是这里的例子.

现在,符合C(++)标准的答案显然没有.

但是,在Windows和Visual C++编译器上,情况似乎并不那么清楚.

我最近回答,并引用了官方的MSDN文档volatile

微软特定

声明为volatile的对象是(...)

  • 对volatile对象的写入(volatile write)具有Release语义; 对全局或静态对象的引用在编译二进制文件中的易失性写入之前,将在写入指令序列中的易失性对象之前发生这种情况.
  • 读取volatile对象(volatile read)具有Acquire语义; 对全局或静态对象的引用 在读取编译二进制文件中的易失性读取之后,将在读取指令序列中的易失性存储器之后发生这种情况.

这允许volatile对象用于多线程应用程序中的内存锁定和释放.

[强调我的]

现在,读到这一点,在我看来,MS编译器将处理一个易变量变量,就像std::atomic即将推出的C++ 11标准一样.

然而,在对我的回答评论中,用户Hans Passant写道:"那篇MSDN文章非常不幸,这是错误的.你不能用volatile来实现锁定,甚至不能使用微软的版本.(...)"


请注意:MSDN中给出的示例看起来很可疑,因为您通常无法在没有原子交换的情况下实现锁定.(正如亚历克斯指出的那样)这仍然留下了问题.有关此MSDN文章中给出的其他信息的有效性,特别是对于此处此处的用例.)


此外,还有Interlocked*函数的文档,尤其是InterlockedExchange带有volatile(!?)变量并进行原子读取和写入.(注意我们在SO上有一个问题 - 何时应该使用InterlockedExchange? - 没有权威性地回答是否需要这个函数来进行只读或只写原子访问.)

更重要的是,volatile上面引用的文档以某种方式暗示"全局或静态对象",我认为"真正的" 获取/释放语义应该适用于所有值. …

c++ atomic volatile memory-fences visual-c++

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

如何在现代C++中解析文本数据文件?

我(经常)面临着必须解析文本数据文件的任务 - 在"每个人"使用XML之前使用的文本结构化数据表示 - 这是某种行业标准.(这些太多了.)

无论如何,基本任务总是采用文本文件并填充某种数据结构中的内容,以便我们的C++代码可以对信息做些什么.

现在,我已经手工实现了一些简单的(并且非常多样的)解析器,并且我几乎没有鄙视.:-)

所以 - 我想知道当我想要将结构化文本数据"解析"为内存中表示时的当前技术水平(想想:任意语言的XML数据绑定).

到目前为止我发现的是" 你推荐什么解析器生成器 ",但我不太确定我是在使用解析器生成器(如ANTLR)之后.

明显的候选人似乎是pegtlBoost.Spirit,但他们似乎都很复杂(但至少他们是语言),上次我尝试过Spirit,编译错误让我疯狂.(并且pegtl需要兼容C++ 11的编译器,这仍然是一个问题(VC++ 2005).)

所以我错过了一个简单的解决方案,只是为了得到类似的东西

/begin COMPU_METHOD
  DEC "  Decimal value"
  RAT_FUNC
  "%3.0"
  "dec"
  COEFFS 0 1.000000 0.000000 0 0.000000 1.000000
/end COMPU_METHOD
Run Code Online (Sandbox Code Playgroud)

进入C++数据结构?(这只是这个文件的一部分可能看起来的任意例子.对于这种格式,我可以(并且可能应该)购买一个库来解析它,因为它足够广泛 - 对于所有格式我都不是这样的情况遭遇.)

- 或者我应该选择 Boost.Spirit 的复杂性

c++ parsing dataformat boost-spirit

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

Visual Studio单元测试32位和64位

我有一个包含C++和C++/CLI代码的项目的解决方案,以及一组使用Microsoft Unit Test Framework对所有这些进行单元测试的项目.对于C++/CLI项目,单元测试项目是C#单元测试.我目前拥有的是32位和64位平台.此外,对于每个平台,我将单元测试项目设置为32位和64位平台以匹配.

我遇到的问题是,当我切换到32位与64位时,我需要 TEST > TEST SETTINGS > DEFAULT PROCESSOR ARCHITECTURE根据需要从32位和64位转换.如果不这样做,我会收到Visual Studio的警告,即64位映像无法在32位进程中运行.这是有道理的,但肯定有一些方法可以实现自动化吗?否则,如果我在构建机器上进行批量构建,我将无法控制它,单元测试将失败.

此外,我已尝试将单元测试项目设置为AnyCPU,但此操作失败并显示"尝试加载程序格式不正确"的错误

还有更好的方法吗?

c++ unit-testing c++-cli visual-studio-2012

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

是否可以复制.NET HashAlgorithm(用于重复的增量散列结果)?

我有以下用例:

  • 从文件中读取n个字节
  • 计算这些n个字节的(MD5)哈希值
  • 从文件中读取下一个m字节
  • 计算(MD5)哈希,文件最多为n + m个字节

增量散列文件不是问题,只需调用TransformBlockTransformFinalBlock.

问题是我需要多个哈希的数据共享它的起始字节,但在我调用TransformFinalBlock读取Hash第一个n字节后,我不能继续使用相同的对象进行哈希并需要一个新的字节.

在搜索问题时,我发现PythonOpenSSL都可以选择复制散列对象,以实现此目的:

hash.copy()

返回哈希对象的副本("克隆").这可以用于有效地计算共享公共初始子字符串的字符串的摘要.

 

EVP_MD_CTX_copy_ex()可用于将消息摘要状态从in复制到out.如果要散列的大量数据仅在最后几个字节中有所不同,这非常有用.必须在调用此函数之前初始化out.

正如我可能搜索的那样,我找不到任何包含库存C#HashAlgorithm的东西,它允许我调用它的方法之前有效地Clone()= =复制这样的对象- 然后继续用克隆散列其余的数据.TransformFinalBlock

我找到了一个MD5C#参考实现,可以简单地适应支持克隆(*),但是我更倾向于使用那些而不是将这样的东西引入代码库.

(*)实际上,据我所知,任何哈希算法(与加密/解密相反)我都很难检查,因为这种算法所具有的所有状态都是一种摘要形式.

所以我在这里遗漏了一些东西,或者标准的C#/ .NET接口实际上是不是提供了复制哈希对象的方法?


另一个数据点:

微软自己加密服务原生API 有一个功能CryptDuplicateHash,其中的文档状态,引用:

CryptDuplicateHash函数可用于创建以相同内容开头的两个不同内容的单独哈希.

自Windows XP以来一直存在.: - |


注意wrt.MD5:用例不具有加密敏感性.只是可靠的文件校验和.

c# md5 clone hashalgorithm

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

什么原因导致Star​​tServiceCtrlDispatcher()失败1063(ERROR_FAILED_SERVICE_CONTROLLER_CONNECT)?

我看到我的Windows服务程序出现了奇怪的错误.我的服务程序StartServiceCtrlDispatcher()在它的最开始调用main(),但有时失败了1063 (ERROR_FAILED_SERVICE_CONTROLLER_CONNECT).

我知道如果用户手动启动程序(作为控制台程序),则会发生此错误.但事实并非如此. 当发生此错误时,我添加了一个代码来检查服务程序的父进程,它告诉services.exe是父进程(我认为可以安全地假设我的程序是由SCM正确启动的).

不幸的是,这个错误不能在我的开发机器上重现,也不能自己调试,但在用户系统上捕获的错误日志告诉:

  • 这个问题似乎只发生在这个程序的所有用户中.
  • 即使问题发生,也似乎不重复.下次服务通常成功启动.
  • 发生此问题时,StartServiceCtrlDispatcher()在返回失败之前会停止大约一秒钟.

有没有人见过类似的错误?如果是这样,错误的原因是什么?

windows winapi windows-services

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

为什么指针访问比vector :: iterator访问慢?(编译器代码生成)

好吧,问题标题有点蹩脚,但我真的不知道如何更好地表达这一点.

我遇到的问题是,给定a + std::vector<T>a T*+ size_t count我的编译器(Visual Studio 2005/VC++ 8)实际上在循环指针时生成的代码比循环遍历向量时更差.

也就是说,我有一个包含向量的测试结构,另一个包含指针+计数.现在,在写入语义完全相同的循环结构,该版本与所述的std ::矢量时是显著(这是说> 10%)比用指针的版本更快.

您将在下面找到代码以及生成的程序集.如果有人能解释这里发生了什么,那就太好了.

如果查看程序集,可以注意原始指针版本如何生成稍多的指令.如果有人能解释这些版本在汇编级别上的语义差异,那将是一个非常好的答案.

并且不要回答告诉我我不应该关心,过早优化,所有邪恶的根源等等.在这个特定的情况下我关心,无论如何我认为这是一个相当有趣的难题!:-)


编译器设置:

  • 完全优化(/ Ox)
  • 整个计划选择.=不

代码如下:

stdafx.h中

// Disable secure STL stuff!
#define _SECURE_SCL 0
#define _SECURE_SCL_THROWS 0
#include <iostream>
#include <iomanip>
#include <vector>
#include <mmsystem.h>
Run Code Online (Sandbox Code Playgroud)

头文件

// loop1.h
typedef int PodType;

const size_t container_size = 3;
extern volatile size_t g_read_size;

void side_effect();

struct RawX {
    PodType* pData;
    PodType wCount;

    RawX()
    : pData(NULL)
    , wCount(0)
    { …
Run Code Online (Sandbox Code Playgroud)

c++ compiler-construction debugging performance assembly

10
推荐指数
1
解决办法
1084
查看次数

std :: map分配节点打包?

我注意到Visual Studio(2010)的std :: map实现为其红黑树中的每个节点分配了一个新的单个内存块.也就是说,对于映射中的每个元素,将使用operator new ... mallocVisual Studio STL实现的std :: map的默认分配方案分配单个新的原始内存块.

这对我来说有点浪费:在"(小)n"块中分配节点会不会更有意义,就像std :: vector实现在增长时过度分配一样?

所以我想澄清以下几点:

  • 我对默认分配方案的断言是否真的正确?
  • std :: map的"all"STL实现是否以这种方式工作?
  • std中是否有任何东西阻止std :: map实现将其节点放入内存块而不是为每个节点分配一个新的内存块(通过其分配器)?(复杂性保证等)?

注意:这不是过早优化.如果它关于优化,那么它关于如果应用程序有问题(std::)映射内存碎片,是否有使用自定义分配器使用内存池的替代方法?这个问题不是关于自定义分配器,而是关于地图实现如何使用其分配器.(或者我希望是这样.)

c++ memory-management stl

10
推荐指数
1
解决办法
2113
查看次数

在多个文件中使用时,没有参数的#pragma hdrstop会怎么做?

#pragma hdrstop在几个源(cpp)文件中放入(无文件名参数)的实际价值("它做什么")是什么?

请注意,MSDN文档(再一次)对我来说一样清楚.

编辑/注意:我问这个,因为这个答案和它链接的文章似乎建议.但我不明白为每个编译单元分别有一个pch文件有什么好处.

c++ precompiled-headers visual-c++

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

CloseWindow和WM_CLOSE的关系是什么

我目前有点困惑:WM_CLOSE是否与::CloseWindow任何"相关"或完全不同的东西?

Closing Windows的文档根本没有提到API函数CloseWindow.应该CloseWindow真的叫做"MinimizeWindow"还是我错过了什么?

windows winapi mfc window-messages

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