在x86上有两种众所周知的方法可以将整数寄存器设置为零值.
或
mov reg, 0
Run Code Online (Sandbox Code Playgroud)
要么
xor reg, reg
Run Code Online (Sandbox Code Playgroud)
有一种观点认为第二种变体更好,因为值0没有存储在代码中并且节省了几个字节的生成的机器代码.这绝对是好的 - 使用较少的指令缓存,这有时可以实现更快的代码执行.许多编译器生成这样的代码.
然而,在xor指令和改变相同寄存器的早期指令之间正式存在指令间依赖性.由于存在依赖性,后一条指令需要等到前者完成,这可能会减少处理器单元的负载并损害性能.
add reg, 17
;do something else with reg here
xor reg, reg
Run Code Online (Sandbox Code Playgroud)
很明显,无论初始寄存器值如何,xor的结果都将完全相同.但是处理器能够识别出这个吗?
我在VC++ 7中尝试了以下测试:
const int Count = 10 * 1000 * 1000 * 1000;
int _tmain(int argc, _TCHAR* argv[])
{
int i;
DWORD start = GetTickCount();
for( i = 0; i < Count ; i++ ) {
__asm {
mov eax, 10
xor eax, eax
};
}
DWORD diff = GetTickCount() - start;
start = …Run Code Online (Sandbox Code Playgroud) 所以我发现C(++)程序实际上并没有编译成简单的"二进制"(我可能在这里遇到了一些问题,在这种情况下我很抱歉:D)但是对于一系列事物(符号表) ,os相关的东西,...)但......
汇编程序"编译"到纯二进制文件?这意味着除了预定义的字符串等资源之外没有额外的东
如果C编译成除了普通二进制文件以外的其他内容,那么小型汇编程序引导程序如何只是将指令从HDD复制到内存并执行它们?我的意思是,如果操作系统内核(可能用C语言编写)编译成不同于普通二进制文件的东西 - 引导加载程序如何处理它?
编辑:我知道汇编程序没有"编译",因为它只有你的机器的指令集 - 我没有找到汇编程序"汇编"的好词.如果你有一个,请留在这里作为评论,我会改变它.
我们的数据库是基于EAV(实体 - 属性 - 值)模型设计的.那些使用EAV模型的人知道为了灵活性而附带的所有垃圾.
我向我的客户询问了使用EAV模型的原因(灵活性),他们的反应是:他们的实体随着时间而变化.因此,今天他们可能有一个具有一些属性的表,但在一个月的时间内,可能会添加一些新属性,或者可能会重命名现有属性.他们需要生成报告以回到任何阶段,并根据该阶段的实体形状查询数据.
我理解这对于传统的关系模型是不可行的,但我个人认为EAV是反模式的.是否有其他替代模型使我们能够捕获实体和实例更改的时间维度?
干杯,莫什
database database-design data-modeling entity-attribute-value data-structures
好吧所以我在我的装配中有这条线
MOV EAX, DWORD PTR DS:[ESI]
Run Code Online (Sandbox Code Playgroud)
ESI是00402050(ascii,"123456789012")
在这个指示之后: EAX = 34333231
这里到底发生了什么?这个值是如何计算的,为什么?
我在哪里可以得到一些关于这类事情的好参考?
当迭代一组程序集(例如AppDomain.CurrentDomain.GetAssemblies())时,如果您尝试访问CodeBase等属性,动态程序集将抛出NotSuportedException.如何在不触发和捕获NotSupportedException的情况下判断程序集是否是动态的?
我没想到在这个阶段我会在Java中遇到全新的语法,但是,我刚刚遇到了一些问题:
确切的上下文以及下面的代码应该做的事情是非常无关紧要的 - 它只是提供某种上下文.
我正在尝试综合在IT Mill Toolkit中创建一个事件,所以我写了这样一行:
buttonClick(new Button.ClickEvent(button));
Run Code Online (Sandbox Code Playgroud)
但是,Eclipse给出了以下错误消息:
不能访问类型为Button的封闭实例.必须使用Button类型的封闭实例限定分配(egxnew A(),其中x是Button的实例).
当我按如下方式重写上面的行时,它不会再抱怨了:
buttonClick(button.new ClickEvent(button)); // button instanceof Button
Run Code Online (Sandbox Code Playgroud)
所以,我的问题是:后面的语法是什么意思,确切地说,为什么第一个片段不起作用?什么是Java抱怨,以及它在第二个版本中做了什么?
背景信息:无论Button和Button.ClickEvent是非抽象公共类.
我正在寻找一个快速,仅整数算法来找到无符号整数的平方根(整数部分).代码必须在ARM Thumb 2处理器上具有出色的性能.它可以是汇编语言或C代码.
任何提示欢迎.
鉴于:
FieldInfo field = <some valid string field on type T>;
ParameterExpression targetExp = Expression.Parameter(typeof(T), "target");
ParameterExpression valueExp = Expression.Parameter(typeof(string), "value");
Run Code Online (Sandbox Code Playgroud)
如何编译lambda表达式以将"target"参数上的字段设置为"value"?
我和同事为在x86,x64,Itanium,PowerPC和其他10年历史的服务器CPU上运行的各种平台编写软件.
我们刚刚讨论了pthread_mutex_lock()... pthread_mutex_unlock()等互斥函数本身是否足够,或者受保护变量是否需要是volatile.
int foo::bar()
{
//...
//code which may or may not access _protected.
pthread_mutex_lock(m);
int ret = _protected;
pthread_mutex_unlock(m);
return ret;
}
Run Code Online (Sandbox Code Playgroud)
我担心的是缓存.编译器是否可以在堆栈或寄存器中放置_protected的副本,并在赋值中使用该陈旧值?如果没有,是什么阻止了这种情况发生?这种模式的变化是否易受攻击?
我假设编译器实际上并不理解pthread_mutex_lock()是一个特殊函数,所以我们只是受序列点保护吗?
非常感谢.
更新:好的,我可以看到一个趋势,答案解释了为什么不稳定是坏的.我尊重这些答案,但有关该主题的文章很容易在网上找到.我在网上找不到的,以及我问这个问题的原因,就是我如何保护我没有不稳定.如果上面的代码是正确的,那么缓存问题如何无懈可击?