从理论上讲,应该至少可以强制验证无锁算法(只有很多函数调用的组合相交).是否有任何工具或形式推理过程可用于实际证明无锁算法是正确的(理想情况下它还应该能够检查竞争条件和ABA问题)?
注意:如果您知道一种方法来证明一点(例如,只证明它对ABA问题是安全的)或者我没有提到的问题,那么无论如何都要发布解决方案.在最坏的情况下,可以依次完成每种方法以完全验证它.
根据广义常量表达式 - 修订版5,以下是非法的.
constexpr int g(int n) // error: body not just ‘‘return expr’’
{
int r = n;
while (--n > 1) r *= n;
return r;
}
Run Code Online (Sandbox Code Playgroud)
这是因为所有'constexpr'函数都必须具有这种形式{ return expression; }.我看不出有任何理由需要这样做.
在我看来,唯一真正需要的是不读取/写入外部状态信息,传入的参数也是'constexpr'语句.这意味着对具有相同参数的函数的任何调用都将返回相同的结果,因此可以在编译时"知道".
我的主要问题是,它似乎只是强迫你做一些真正的回旋形式的循环,并希望编译器优化它,以便它对非constexpr调用同样快.
要constexpr为上面的例子写一个有效的,你可以这样做:
constexpr int g(int n) // error: body not just ‘‘return expr’’
{
return (n <= 1) ? n : (n * g(n-1));
}
Run Code Online (Sandbox Code Playgroud)
但是这很难理解,你必须希望编译器在使用违反要求的参数调用时处理尾递归const-expr.
我正在寻找一种方法来解析c ++代码以检索有关类的一些基本信息.我实际上并不需要代码本身的大量信息,但我确实需要它来处理宏和模板之类的东西.简而言之,我想提取代码的"结构",你将在UML图中显示.
对于代码库中的每个类/ struct/union/enum/typedef,我需要的所有内容(在处理模板和宏之后)是:
代码中的实际指令与我的目的无关.
我期待很多人说我应该使用正则表达式(甚至Flex&Bison),但这些并不是真正有效的,因为我需要正确处理预处理器和模板的东西.
我目前正致力于跨平台应用程序,并对其他人如何解决以下问题感到好奇:
显然,这是针对像c/c ++这样的语言,它们不会抽象大部分内容(不像java或c#,很多系统都不支持).
如果你很好奇,我正在开发的系统是Nintendo DS,Wii,PS3,XBox360和PC.
这是我解决问题的方式(如果你没有从上面的系统列表中猜到,我正在开发控制台/ Windows游戏).请记住,我工作的系统通常没有为他们编写的跨平台库(索尼实际上建议您从头开始编写自己的渲染引擎,并使用他们的OpenGL实现,这并不完全遵循无论如何,作为参考标准).
Endianess
我们的所有资产都可以为每个系统定制.我们所有的原始数据(纹理除外)都存储在XML中,我们在构建项目时将其转换为系统特定的二进制格式.看看我们如何开发游戏机,我们不需要担心在具有不同端格式的平台之间传输数据(只有PC允许用户这样做,因此,它也与其他系统隔离) .
浮点支持
大多数现代系统的浮点值都很好,例外的是Nintendo DS(和GBA,但这对我们来说几乎是一个死的平台).我们通过2个不同的类来处理它.第一个是"固定点"类(模板化,可以指定要使用的整数类型以及十进制值的多少位),它实现所有算术运算符(处理位移)并自动执行类型转换.第二个是"浮点"类,它基本上只是浮点数的一个包装器,大多数情况下,唯一的区别是它还实现了移位运算符.通过实现移位运算符,我们可以在DS上使用位移进行快速乘法/除法,然后无缝转换到更好地使用浮点数的平台(如XBox360).
I/O系统
这可能是我们最棘手的问题,因为每个系统都有有自己的控制器的输入,图形(XBOX360使用的DirectX9的变体,PS3有OpenGL,也可以从头开始编写自己和DS和Wii有方法thier自己的专有系统),声音和网络(真的只有DS的协议相差不大,但随后他们每个人都有,你必须使用自己的服务器系统).
我们最终解决,这是通过简单地写相当高的水平包装为每个系统的方式(如网格图形,用于控制器等关键绘图系统),并让所有的系统使用相同的头文件进行访问.这不只是一个写具体的cpp文件为每个平台(从而形成"发动机")的问题.
编译器差异
这是一件无法轻易解决的问题,因为我们遇到了编译器的问题,我们通常会在本地维基上记录信息(因此其他人可以查看要注意的内容以及使用它的变通方法)如果可能的话,写一个宏来处理我们的情况.虽然它不是最优雅的解决方案,它可以工作并看到某些编译器在某些地方被简单地破坏,但更优雅的解决方案往往会破坏编译器.(我只是希望所有编译器都实现了Microsoft的"#pragma once"命令,比在#ifdef中包装所有内容要容易得多)
我正在寻找相当于LWARX和STWCX(在PowerPC处理器上找到)或在x86平台上实现类似功能的方法.此外,哪里是最好的地方找到这样的事情(即锁定/等待免费编程的好文章/网站/论坛).
编辑
我想我可能需要提供更多细节,因为我假设我只是在寻找CAS(比较和交换)操作.我要做的是实现一个带有智能指针的无锁引用计数系统,可以通过多个线程访问和更改.我基本上需要一种在x86处理器上实现以下功能的方法.
int* IncrementAndRetrieve(int **ptr)
{
int val;
int *pval;
do
{
// fetch the pointer to the value
pval = *ptr;
// if its NULL, then just return NULL, the smart pointer
// will then become NULL as well
if(pval == NULL)
return NULL;
// Grab the reference count
val = lwarx(pval);
// make sure the pointer we grabbed the value from
// is still the same one referred to by 'ptr'
if(pval != *ptr)
continue;
// Increment … 我是游戏开发人员,现在正在为我们公司编写跨平台,多线程引擎.可以说,游戏引擎中最强大的工具之一就是它的脚本系统,因此我正在寻找一种新的脚本语言来集成到我们的引擎中(目前使用相对基本的内部引擎).
所需脚本系统的主要功能(按重要性顺序)是:
到目前为止,我已经积累了使用Lua,Squirrel(OO语言,基于Lua)并编写了一个ActionScript 2虚拟机的经验.
那么,您建议哪种脚本系统符合上述标准?(如果可能的话,您是否也可以发布或链接到您可能拥有的其他脚本语言的任何比较)
谢谢,格兰特
我目前正在编写一个提供自定义的扩展TextFormattingParagraphProperties(通过ITextParagraphPropertiesFactoryService)。这似乎工作正常,除非我想由于文档中其他地方的更改而更新行的格式。
似乎ITextParagraphPropertiesFactoryService.Create()仅对编辑器确定为“无效”的每一行调用(无论该行发生更改还是在屏幕上变得可见)。
有什么方法可以强制 IWpfTextView 刷新其布局(整个可见文档或理想情况下的特定行)?
TextFormattingParagraphPropertiesPS我正在使用的具体功能是TextTabProperties,据我所知,这是修改选项卡单独间距的唯一方法(即,它们并不都是统一的)
谢谢
我在VS2010中为我的VC++项目设置了自定义构建规则.在此规则中,我想允许用户在是否处理文件时添加复杂条件.
这也需要在目标执行时而不是在"项目"本身的"条件"中进行评估(由于只有'应用程序'项目可以处理它并且需要使用'应用'项目,而不是依赖项目).
我已经尝试向对象添加自定义字段,然后在执行时只删除组中的项目.例如
<ItemGroup>
<MyItemType Remove="@(MyItemType)" Condition="!(%(MyItemType.IncludeCondition))" />
</ItemGroup>
Run Code Online (Sandbox Code Playgroud)
不幸的是,这给了我错误:
错误MSB4113:指定条件"!(%(MyItemType.IncludeCondition))"评估为"!'testfilename1'=='testfilename2'或false"而不是布尔值.
('%(MyItemType.IncludeCondition)'中的原始条件表达式是'%(Filename)' == 'testfilename2' or $(TestBooleanFalse))
看起来好像MSBuild不会将项元数据的内容评估为布尔值(在大多数情况下这似乎是很好的做法,而不是这个).
无论如何我可以让MSbuild实际将元数据评估为布尔值,还是有其他方法可以用来获得相同的结果?
PS我已经简要了解了MSBuild 属性函数,但是看不到任何会在函数输入上运行MSBuild布尔评估代码的东西)
一个非常精简的MSBuild项目示例显示了这个问题,由Lanrokin提供:
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" DefaultTargets="Build">
<ItemGroup>
<MyItemType Include="item1.ext1" />
<MyItemType Include="item1.ext2" />
</ItemGroup>
<Target Name="SpecifyConditions">
<ItemGroup>
<MyItemType>
<IncludeCondition>'%(Filename)%(Extension)' == 'item1.ext1'</IncludeCondition>
</MyItemType>
</ItemGroup>
</Target>
<Target Name="Build" DependsOnTargets="SpecifyConditions">
<Message Importance="high" Text="@(MyItemType)" Condition="%(MyItemType.IncludeCondition)" />
</Target>
</Project>
Run Code Online (Sandbox Code Playgroud) 我正在编写一个内存跟踪系统,我实际遇到的唯一问题是,当应用程序退出时,任何未在其构造函数中分配但在解构器中解除分配的静态/全局类都会在我的内存之后释放跟踪内容已将分配的数据报告为泄漏.
我可以告诉我,正确解决这个问题的唯一方法是强制将内存跟踪器的_atexit回调放置在堆栈的头部(以便最后调用它)或者让它在整个执行后执行_atexit堆栈已解除.实际上是否可以实现这些解决方案中的任何一种,或者是否存在我忽略的另一种解决方案.
编辑:我正在开发/开发Windows XP并使用VS2005进行编译.
我目前正在从另一个平台移植一些代码,新平台上的bool是1字节大小的.这会破坏我们的加载代码,因为值存储为32位值.此外,速度是我们平台上的一个关键问题,我们希望使用32位bool,因为处理器本身以32位运行,并且需要额外的操作来比较非32位bool.
有没有办法强制gcc使用32位bool而不是8位bool?
c++ ×6
algorithm ×1
allocation ×1
atexit ×1
c ×1
c# ×1
c++11 ×1
gcc ×1
lock-free ×1
low-level ×1
msbuild ×1
msbuild-4.0 ×1
parsing ×1
performance ×1
rationale ×1
scripting ×1
types ×1
verification ×1
visual-c++ ×1
vsx ×1
x86 ×1