(注意:标题似乎并不清楚 - 如果有人可以改写,我就是全部!)
鉴于这个正则表达式:(.*_e\.txt),它匹配一些文件名,我需要添加一些其他单字符后缀除了e.我应该选择一个角色类还是应该使用替换?(或者这真的很重要??)
也就是说,以下哪两个似乎"更好",以及为什么:
a)(.*(e|f|x)\.txt),或
b) (.*[efx]\.txt)
有一对夫妇在这个网站,询问使用是否问题volatile变量原子/多线程访问是可能的:见这里,这里,还是这里的例子.
现在,符合C(++)标准的答案显然没有.
但是,在Windows和Visual C++编译器上,情况似乎并不那么清楚.
微软特定
声明为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上面引用的文档以某种方式暗示"全局或静态对象",我认为"真正的" 获取/释放语义应该适用于所有值. …
我(经常)面临着必须解析文本数据文件的任务 - 在"每个人"使用XML之前使用的文本结构化数据表示 - 这是某种行业标准.(这些太多了.)
无论如何,基本任务总是采用文本文件并填充某种数据结构中的内容,以便我们的C++代码可以对信息做些什么.
现在,我已经手工实现了一些简单的(并且非常多样的)解析器,并且我几乎没有鄙视.:-)
所以 - 我想知道当我想要将结构化文本数据"解析"为内存中表示时的当前技术水平(想想:任意语言的XML数据绑定).
到目前为止我发现的是" 你推荐什么解析器生成器 ",但我不太确定我是在使用解析器生成器(如ANTLR)之后.
明显的候选人似乎是pegtl和Boost.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++和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,但此操作失败并显示"尝试加载程序格式不正确"的错误
还有更好的方法吗?
我有以下用例:
增量散列文件不是问题,只需调用TransformBlock和TransformFinalBlock.
问题是我需要多个哈希的数据共享它的起始字节,但在我调用TransformFinalBlock读取Hash第一个n字节后,我不能继续使用相同的对象进行哈希并需要一个新的字节.
在搜索问题时,我发现Python和OpenSSL都可以选择复制散列对象,以实现此目的:
hash.copy()
返回哈希对象的副本("克隆").这可以用于有效地计算共享公共初始子字符串的字符串的摘要.
EVP_MD_CTX_copy_ex()可用于将消息摘要状态从in复制到out.如果要散列的大量数据仅在最后几个字节中有所不同,这非常有用.必须在调用此函数之前初始化out.
正如我可能搜索的那样,我找不到任何包含库存C#HashAlgorithm的东西,它允许我在调用它的方法之前有效地Clone()= =复制这样的对象- 然后继续用克隆散列其余的数据.TransformFinalBlock
我找到了一个MD5的C#参考实现,可以简单地适应支持克隆(*),但是我更倾向于使用那些而不是将这样的东西引入代码库.
(*)实际上,据我所知,任何哈希算法(与加密/解密相反)我都很难检查,因为这种算法所具有的所有状态都是一种摘要形式.
所以我在这里遗漏了一些东西,或者标准的C#/ .NET接口实际上是不是提供了复制哈希对象的方法?
另一个数据点:
微软自己的加密服务原生API 有一个功能CryptDuplicateHash,其中的文档状态,引用:
CryptDuplicateHash函数可用于创建以相同内容开头的两个不同内容的单独哈希.
自Windows XP以来一直存在.: - |
注意wrt.MD5:用例不具有加密敏感性.只是可靠的文件校验和.
我看到我的Windows服务程序出现了奇怪的错误.我的服务程序StartServiceCtrlDispatcher()在它的最开始调用main(),但有时失败了1063 (ERROR_FAILED_SERVICE_CONTROLLER_CONNECT).
我知道如果用户手动启动程序(作为控制台程序),则会发生此错误.但事实并非如此. 当发生此错误时,我添加了一个代码来检查服务程序的父进程,它告诉services.exe是父进程(我认为可以安全地假设我的程序是由SCM正确启动的).
不幸的是,这个错误不能在我的开发机器上重现,也不能自己调试,但在用户系统上捕获的错误日志告诉:
StartServiceCtrlDispatcher()在返回失败之前会停止大约一秒钟.有没有人见过类似的错误?如果是这样,错误的原因是什么?
好吧,问题标题有点蹩脚,但我真的不知道如何更好地表达这一点.
我遇到的问题是,给定a + std::vector<T>a T*+ size_t count我的编译器(Visual Studio 2005/VC++ 8)实际上在循环指针时生成的代码比循环遍历向量时更差.
也就是说,我有一个包含向量的测试结构,另一个包含指针+计数.现在,在写入语义完全相同的循环结构,该版本与所述的std ::矢量时是显著(这是说> 10%)比用指针的版本更快.
您将在下面找到代码以及生成的程序集.如果有人能解释这里发生了什么,那就太好了.
如果查看程序集,可以注意原始指针版本如何生成稍多的指令.如果有人能解释这些版本在汇编级别上的语义差异,那将是一个非常好的答案.
并且请不要回答告诉我我不应该关心,过早优化,所有邪恶的根源等等.在这个特定的情况下我会关心,无论如何我认为这是一个相当有趣的难题!:-)
编译器设置:
代码如下:
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) 我注意到Visual Studio(2010)的std :: map实现为其红黑树中的每个节点分配了一个新的单个内存块.也就是说,对于映射中的每个元素,将使用operator new ... mallocVisual Studio STL实现的std :: map的默认分配方案分配单个新的原始内存块.
这对我来说有点浪费:在"(小)n"块中分配节点会不会更有意义,就像std :: vector实现在增长时过度分配一样?
所以我想澄清以下几点:
注意:这不是过早优化.如果它关于优化,那么它关于如果应用程序有问题(std::)映射内存碎片,是否有使用自定义分配器使用内存池的替代方法?这个问题不是关于自定义分配器,而是关于地图实现如何使用其分配器.(或者我希望是这样.)
我目前有点困惑:WM_CLOSE是否与::CloseWindow任何"相关"或完全不同的东西?
Closing Windows的文档根本没有提到API函数CloseWindow.应该CloseWindow真的叫做"MinimizeWindow"还是我错过了什么?
c++ ×6
visual-c++ ×2
winapi ×2
windows ×2
assembly ×1
atomic ×1
boost-spirit ×1
c# ×1
c++-cli ×1
clone ×1
dataformat ×1
debugging ×1
md5 ×1
mfc ×1
parsing ×1
performance ×1
perl ×1
regex ×1
stl ×1
unit-testing ×1
volatile ×1