我的代码中有一个高性能关键部分,我需要尽可能地减少cpu负载。如果我有一个具有一个实例的结构,那么在代码中通过iteself定义变量之间的性能是否存在差异:
int something;
int randomVariable;
或在struct中定义它们?
struct Test
{
int something;
int randomVariable;
}
因为我想使用struct来使代码看起来更好
答案 0 :(得分:1)
首先,公平地说,因为我想使用struct来使代码看起来更好纯粹是一种风格的东西。一个人看起来更好看对另一个人看起来不太好。
由于多种原因,我可以选择struct
。
速度/尺寸效率:
当数据需要作为函数参数传递时,比较struct
超过两个离散的int
变量。
使用:
int a;
int b;
或者
typedef struct {
int a;
int b;
}VAR;
VAR var;
相同的数据可以通过函数参数作为单独的指针传递(假设32位寻址):
int func1(int *a, int *b);//two 32 bit addresses passed
或者:
int func2(VAR *v);//one 32 bit address passed
随着变量数量的增加,效率(此类型)直接上升 (如果有100个整数,效率提升?)
在第一个示例中,您传递了两个int *
,而在第二个示例中,只传递了一个struct
。它有一点不同,但它有所不同。优势的大小还取决于所使用的寻址。 32位或64位。
代码维护和可读性:
函数原型,当用作应用程序编程接口( API )时应该是稳定的。使用struct
作为参数或返回类型支持此接口稳定性。
例如:鉴于需要计算x,y&amp;的 Cartesian coordinates 中的变化速度。 z,对于相对于时间以直线移动的对象,您可以设计一个函数,该函数将使用当前的速度 xyz 和加速度 xyz 和时间重复调用<子>毫秒子>。所需参数的数量明确建议使用typedef struct {
double x;
double y;
double z;
}VEL; //velocity
typedef struct {
double x;
double y;
double z;
}ACC; //acceleration
typedef struct {
VEL vel;
ACC acc;
time_t ms;
}KIN; //kinematics
KIN * GetVelocity(KIN *newV);
。 Struct也被建议作为返回类型:
typedef struct {
double x;
double y;
double z;
}POS; //position
...
typedef struct {
POS pos;
VEL vel;
ACC acc;
time_t ms;
}KIN; //kinematics
KIN * GetVelocity(KIN *newV);//prototype will continue to work
//without changing interface (argument list)
KIN * GetPosition(KIN *newV);//new prototype for position also supported
如果向项目中添加了了解Position xyz 的新要求,则必须添加的所有内容都是KIN结构的新成员:
<a class=" rhpcon" href="#">
<div class="rhccont">Content</div>
</a>
jQuery(document).on( 'click', '.rhpcon', function(e) {
var rhccont= jQuery(this).children().find('.rhccont').html();
alert(rhccont);
});
答案 1 :(得分:1)
在我看来,知道这个的最好方法,首先用C语言编写两个不同的程序,使用struct和without struct然后使用
创建它们的汇编文件 gcc -S file.c
由于我不知道您的代码,我直接为它们分配了值:
int main() {
int something;
int randomVariable;
something = 3;
randomVariable = 3;
return 0;}
和
main() {
struct Test
{
int something;
int randomVariable;
}test;
test.something = 3;
test.randomVariable = 3;
return 0;}
我在我的Ubuntu-64bit,intel i5机器上获得了汇编文件
我看到汇编文件几乎相同
.file "test1.c"
.text
.globl main
.type main, @function
main:
.LFB0:
.cfi_startproc
pushq %rbp
.cfi_def_cfa_offset 16
.cfi_offset 6, -16
movq %rsp, %rbp
.cfi_def_cfa_register 6
movl $3, -8(%rbp) **Second one(with struct) has value -16 instead -8**
movl $3, -4(%rbp) **Second one has value -12 instead of -4**
movl $0, %eax
popq %rbp
.cfi_def_cfa 7, 8
ret
.cfi_endproc
.LFE0:
.size main, .-main
.ident "GCC: (Ubuntu 4.8.4-2ubuntu1~14.04) 4.8.4"
.section .note.GNU-stack,"",@progbits
所以根据结果我可以说两个实现在CPU负载上没有任何显着差异。只有它们之间的区别第二个是使用比第一个更多的内存。