在struct中保存变量

时间:2016-01-09 23:27:55

标签: c struct

我的代码中有一个高性能关键部分,我需要尽可能地减少cpu负载。如果我有一个具有一个实例的结构,那么在代码中通过iteself定义变量之间的性能是否存在差异:

    int something;
    int randomVariable;

或在struct中定义它们?

struct Test
{
    int something;
    int randomVariable;
}

因为我想使用struct来使代码看起来更好

2 个答案:

答案 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负载上没有任何显着差异。只有它们之间的区别第二个是使用比第一个更多的内存。