小编cod*_*eim的帖子

如果我们只有一个成员,那么结构和联盟之间有什么区别吗?

我想知道一个成员数据类型的结构和联合之间的区别,如果有的话.

c c++ struct unions c++11

33
推荐指数
1
解决办法
2033
查看次数

函数的地址不是实际的代码地址

在Visual Studio 2008(C++)中调试一些代码,我注意到我的函数指针变量中的地址不是函数本身的实际地址.这是一个外部"C"功能.

int main() {
   void (*printaddr)(const char *) = &print; // debug shows printaddr == 0x013C1429

}

Address: 0x013C4F10
void print() {
  ...
}
Run Code Online (Sandbox Code Playgroud)

获取函数地址的反汇编是:

   void (*printaddr)(const char *) = &print;
013C7465 C7 45 BC 29 14 3C 01 mov         dword ptr [printaddr],offset print (13C1429h) 
Run Code Online (Sandbox Code Playgroud)

编辑:我在地址013C4F10查看了代码,编译器显然在该地址插入了"jmp"指令.

013C4F10 E9 C7 3F 00 00   jmp         print (013C1429h) 
Run Code Online (Sandbox Code Playgroud)

实际上,.exe中的每个方法都有一个完整的跳转表.

有人可以解释为什么会这样做吗?这是一个调试"功能"吗?

c++ x86 assembly

22
推荐指数
2
解决办法
4213
查看次数

语言和虚拟机:难以优化的功能及其原因

我正在为一项研究项目做准备调查.

说出一个难以优化的主流语言或语言特征,以及为什么这个特征是否值得付出代价,或者只是用轶事证据揭穿我的理论.在任何人将此标记为主观之前,我要求提供语言或功能的具体示例,以及优化这些功能的想法,或者我没有考虑过的重要功能.此外,任何对证明我的理论是对还是错的实现的引用.

在我的难以优化的功能和我的理论列表中排名第一(我的一些理论是未经测试的,并且基于思想实验):

1)运行时方法重载(也称为多方法调度或基于签名的调度).与允许运行时重新编译或添加方法的功能结合使用时,难以进行优化.或者它是否很难,无论如何?调用站点缓存是许多运行时系统的常见优化,但多方法增加了额外的复杂性,并使内联方法不太实用.

2)键入变形/变体(也就是基于值的键入而不是基于变量)当您不知道某个人的类型是否可以在基本块中更改时,传统的优化根本无法应用.结合多种方法,必须小心地进行内联,并且可能仅针对被调用者的给定阈值大小.即.很容易考虑内联简单的属性提取(getter/setter),但内联复杂的方法可能会导致代码膨胀.另一个问题是我不能只是将一个变量分配给一个寄存器并将它JIT转换为本机指令,因为我必须携带类型信息,或者每个变量需要2个寄存器而不是1.在IA-32上这是不方便的,即使使用x64的额外寄存器进行了改进.这可能是我最喜欢的动态语言功能,因为它从程序员的角度简化了很多东西.

3)第一类连续 - 有多种方法可以实现它们,我在两种最常用的方法中都这样做,一种是堆栈复制,另一种是实现运行时使用连续传递样式,cactus栈,copy-on - 写入堆栈帧和垃圾收集.一流的延续有资源管理问题,即.如果继续恢复,我们必须保存所有内容,并且我不知道是否有任何语言支持留下"意图"的继续(即"我不会回到这里,所以你可以丢弃这个世界的副本" ).在线程模型和控制模型中进行编程后,我知道两者都可以完成同样的事情,但是延续的优雅会给运行时带来相当大的复杂性,也可能影响缓存的效率(使用continuation和co-routines更多地改变堆栈的位置).另一个问题是他们只是没有映射到硬件.对于不太常见的情况,优化延续是优化的,并且正如我们所知,常见情况应该是快速的,并且不太常见的情况应该是正确的.

4)指针算法和掩码指针的能力(以整数存储等)不得不把它扔进去,但实际上我可以很容易地生活.

我的感觉是,许多高级功能,特别是动态语言中的功能,并没有映射到硬件.微处理器实现在芯片上的优化背后有数十亿美元的研究,但语言特征的选择可能使许多这些特性边缘化(诸如缓存,堆栈顶部的别名到寄存器,指令并行,返回地址缓冲区,循环等功能)缓冲区和分支预测).微特征的宏应用并不像某些开发人员想象的那样泛滥,并且在VM中实现多种语言最终将本机操作映射到函数调用(即,语言越动态,我们就越需要查找/在运行时缓存,没有任何东西可以假设,因此我们的指令组合由比传统的静态编译代码更高百分比的非本地分支组成)并且我们唯一可以真正JIT良好的是非动态类型的表达式评估和对常数或直接类型的操作.由于这个原因,字节码虚拟机和JIT核心可能并不总是适用于某些语言.

我欢迎你的回答.

language-features interpreter compiler-theory language-design compiler-optimization

12
推荐指数
1
解决办法
396
查看次数

需要第二(和第三)意见我对此Winforms竞争条件的修复

关于如何实现记录或给前景GUI元素提供状态的后台工作者,在博客等中有一百个例子.其中大多数包括处理产生工作线程和使用ShowDialog()创建前景对话之间存在的竞争条件的方法.但是,我发现一个简单的方法是强制在表单构造函数中创建句柄,这样线程就不能在创建句柄之前触发表单上的Invoke/BeginInvoke调用.

考虑一个使用后台工作线程记录到前台的Logger类的简单示例.

另外,假设我们不希望NLog或其他重型框架做一些如此简单和轻量级的事情.

我的记录器窗口由前台线程使用ShowDialog()打开,但仅在启动后台"worker"线程之后.工作线程调用logger.Log(),它本身使用logForm.BeginInvoke()在前台线程上正确更新日志控件.

  public override void Log(string s)
  {
     form.BeginInvoke(logDelegate, s);
  }
Run Code Online (Sandbox Code Playgroud)

其中logDelegate只是"form.Log()"的简单包装或其他可能更新进度条的代码.

问题在于存在的竞争条件; 当后台工作线程在调用前台ShowDialog()之前开始记录时,表单的Handle尚未创建,因此BeginInvoke()调用失败.

我熟悉各种方法,包括使用Form OnLoad事件和计时器来创建工作任务,直到OnLoad事件生成一个计时器消息,一旦表单显示就启动任务,或者如上所述,使用队列对于消息.但是,我认为只是强制对话框的句柄尽早创建(在构造函数中)可确保没有竞争条件,假设线程由创建对话框的同一线程生成.

http://msdn.microsoft.com/en-us/library/system.windows.forms.control.handle(v=vs.71).aspx

MSDN说:"如果尚未创建句柄,引用此属性将强制创建句柄."

所以我的记录器包装了一个表单,它的构造函数做了:

   public SimpleProgressDialog() {
       var h = form.Handle; // dereference the handle
   }
Run Code Online (Sandbox Code Playgroud)

解决方案看起来太简单了.我特别感兴趣的是为什么看似过于简单的解决方案使用起来或不安全.

任何意见?我错过了别的什么吗?

编辑:我不是要求替代品.如果我没有询问如何使用NLog或Log4net等,我会写一个关于此应用程序的所有客户限制的页面,等等.

根据赞成票的数量,还有很多其他人也想知道答案.

.net c# multithreading .net-3.5 winforms

12
推荐指数
1
解决办法
486
查看次数

流行的源代码控制系统如何区分二进制文件和文本文件

寻找有关不同源控制系统如何区分(或检测)文件类型(二进制文本与文本)的文章,文档或直接知识.特别感兴趣的是Git如何与Mercurial合作.

他们看看:文件扩展名?文件签名或内容(即这个文件是UTF8)?各种各样的东西?

svn git version-control mercurial

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

Windows上的LALR(1)或GLR - 当前的Bison ++/Flex ++的替代品?

更新:此问题已过期,但仅供参考.

原始问题

自2002年以来,我一直在使用相同版本的bison ++(1.21-8)和flex ++(2.3.8-7).

我现在不是在寻找LALR(1)或GLR的替代品,只是寻找最新的选择.是否有人知道这些以后的端口比原来的Cygwin不依赖?

在Windows环境中使用C++编译器开发的其他人(除了ANTLR或Boost.spirit)有哪些?如果您有第一手经验,商业选择是可以的.我也需要在Linux上编译.

更新:当我不知道有关工具建议的政策时,问了这个老问题(不确定2010年是否存在政策,但不管......

我更新到Bison 3.0,它具有GLR功能,并已开始尝试.

我最终决定对我的解析器进行任何重写都是递归下降,以改进错误报告并允许在编译器之外的工具中使用,所以现在我将在Bison中完成参考版本.我认为此时转换为不同的PG工具没什么意义.

c++ compiler-construction parsing lalr bison

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

P6体系结构 - 注册重命名,有限的用户注册会导致更多的操作溢出/加载吗?

我正在研究关于动态语言VM实现的JIT设计.自8086/8088天以来,我没有做太多的装配,只是在这里或那里,所以如果我不合适,那就好了.

据我所知,x86(IA-32)架构目前仍然具有与之相同的基本限制寄存器集,但内部寄存器数量已经大幅增长,但这些内部寄存器通常不可用,并且与寄存器重命名一起使用实现无法并行化的代码的并行流水线操作.我很好地理解了这种优化,但我的感觉是,虽然这些优化有助于整体吞吐量和并行算法,但有限的寄存器集仍然会导致更多的寄存器溢出开销导致如果x86有两倍或四倍的寄存器对我们来说,典型指令流中的推/弹操作码可能会少得多吗?或者是否有其他处理器优化也可以优化这个我不知道的?基本上如果我有一个代码单元有4个寄存器来处理整数工作,但我的单元有十几个变量,我可能每2个左右的指令都有一个push/pop.

是否有任何研究或更好的个人经历?

编辑:x86_64有16个寄存器,这是双x86-32,感谢纠正和信息.

x86 assembly compiler-theory x86-64 cpu-architecture

6
推荐指数
1
解决办法
831
查看次数

WCF自定义验证器:如何从自定义验证器初始化"用户"对象

我有一个工作自定义UserNamePasswordValidator调用我的Oracle数据库.

此类派生自System.IdentityModel.Selectors.UserNamePasswordValidator,Validate()方法返回void.

我从数据库加载我的User对象,一旦验证了密码,我想隐藏我的"User"对象,以便服务可以在进行业务时访问它.在ASP.NET/Java领域,我会把它存入一个会话,或者我的整个Controller类.如何从WCF中的Validator执行此操作?

或者,换句话说,WCF中为服务设置自定义用户域对象的最佳做法是什么.

更新:这就是我如何解决它.我在验证器期间缓存User对象,然后在AuthorizatinPolicy步骤中访问它.

  // this gets called after the custom authentication step where we loaded the User
  public bool Evaluate(EvaluationContext evaluationContext, ref object state)
  {
     // get the authenticated client identity
     IIdentity client = GetClientIdentity(evaluationContext);

     User user;
     OraclePasswordValidator.users.TryGetValue(client.Name, out user);
     if(user != null) {
        // set the custom principal
        evaluationContext.Properties["Principal"] = user;
        return true;
     }

     return false;
  }
Run Code Online (Sandbox Code Playgroud)

c# wcf wcf-security

5
推荐指数
1
解决办法
5783
查看次数

System.Reflection - 全局方法不可用于反射

System.Reflection不支持(AFAIK)反映程序集中的全局方法.在程序集级别,我必须从根类型开始.

我的编译器可以使用全局方法生成程序集,而我的标准引导程序库是一个包含一些全局方法的DLL.我的编译器使用System.Reflection在编译时导入程序集元数据.似乎我依赖System.Reflection,全局方法不可能.最干净的解决方案是将我的所有标准方法转换为类静态方法,但重点是,我的语言允许全局方法,而CLR支持它,但System.Reflection留下了空白.

ildasm显示全局方法就好了,但我认为它不使用System.Reflection本身并直接进入元数据和字节码.

除了System.Reflection之外,是否有人知道我可以使用的任何其他第三方反射或反汇编库(假设我最终会将我的编译器释放为免费的,BSD许可的开源).

解决:除了我所知,没有差距.谢谢你指出GetModules,伙计们!

.net reflection clr ildasm

5
推荐指数
1
解决办法
653
查看次数

C#/.NET 比较两个大列表并从两个列表中查找丢失的项目

所以基本上我有两个大列表,如下所示:

public class Items
{
 public string ItemID { get; set; }
}


var oldList = new List<Items>(); // oldList

var newList = new List<Items>(); // new list
Run Code Online (Sandbox Code Playgroud)

两个列表都非常大,如果它们都很大(超过 30 秒),由于执行时间很短,简单的双 foreach 将是不够的。

在我在 stackoverflow 上问过的上一个问题中,我得到了关于如何比较这两个相同列表并找出哪些项目具有不同 QuantitySold 参数的回复,然后将其存储在名为“DifferentQuantityItems”的第三个列表中,如下所示:

var differentQuantityItems =
    (from newItem in newList
     join oldItem in oldList on newItem.ItemID equals oldItem.ItemID
     where newItem.QuantitySold != oldItem.QuantitySold
     select newItem).ToList();
Run Code Online (Sandbox Code Playgroud)

现在我想从这两个列表中得到以下内容:

- A list of items that are present in newList, but not in oldList

- A list of items that …
Run Code Online (Sandbox Code Playgroud)

c# linq

5
推荐指数
1
解决办法
624
查看次数