在转换为void *和基本结构指针之间是否存在性能差异?

时间:2017-07-03 04:15:09

标签: c pointers gcc struct casting

//Parameters class public Class Parameters { public List<string> A {get; set;} public List<int> B {get; set;} } //some function in a controller public List<SomeResult> GetResult(Parameters pars) { var db = new DbContext(); var result = db.SomeResult.Where(s => s.Any(p =>p.SomeString == pars.A || p.SomeInt == pars.B)) .ToList(); return result; } 进行转换而不是转换为某些基本结构的性能是否存在差异?这部分是为了实现半动态打字系统。

这是我的代码:

void *

因此,就指向结构的指针而言,使用#include "stdlib.h" typedef struct { unsigned char type; } Dyn; typedef struct { unsigned char type; int number; } Num; typedef struct { unsigned char type; char letter; } Lett; int main(void) { Num* n = (Num *)malloc(sizeof(Num)); void* hold = n; // to void * casting Num* n_g = (Num *)hold; Dyn* dhold = (Dyn *)n; // to base struct casting Num* n_d = (Num *)dhold; return 0; } 或基类型结构之间是否有任何性能差异?

1 个答案:

答案 0 :(得分:3)

  

与void *之间的转换性能是否存在差异,而不是转换为某些基本结构?

我们假设:

  • 您的目标平台是一些常见的处理器,如x86,x86-64,ARM,Aarch,PowerPC(32位或64位)

  • 您使用的是优秀的优化编译器(如GCCClang/LLVM

  • 您已启用了一些优化(因此您至少使用-O1-O2进行编译)

然后指针在内部表示为地址,您的性能不应该有任何差别。研究生成的汇编代码(用gcc -O1 -S -fverbose-asm ....)来确定。

但是,你可以考虑使用一些union(指针,或更好的指针union struct。)

顺便说一下,我建议研究一些现有free software解释器的源代码(例如guileluasiod)并阅读一本关于它们的好书(例如Lisp In Small Pieces来自Queinnec)