软件对不同cpu(奔三、core2、不同指令集)的优化是编译器(比如gcc)的事情还是程序代码比如(c代码)的事情?
不管是几核cpu,区别应该是指令集的不同(当然向下兼容)我的看法是应该是 对于除了汇编语言外的编程对不同cpu指令集的优化 是编译器的事情
以上乱说的,各位可以拍砖了
[ 本帖最后由 zjsxwc 于 2011-7-27 10:07 编辑 ]
int main(void) { int num; num += 2; num += 3; return 0; }编译器可能会帮我们优化为:
int main(void) { int num; num += 5; return 0; }毕竟这样达到了同样的效果,至于程序员为什么把 num += 5; 分为两次来写,编译器没必要知道。
#include <stdio.h> typedef struct student { unsigned id; char name[9]; } STUDENT, * PSTUDENT; // 在stdout中写入学生的id和name void print_student_msg(STUDENT student) { printf("id : %u\n", student.id); printf("name : %s\n", student.name); }print_student_msg函数能很好的帮我们完成这个功能,但这是最好的做法吗?如果是我还会问吗:
#include <stdio.h> typedef struct student { unsigned id; char name[9]; } STUDENT, * PSTUDENT; // 在stdout中写入学生的id和name void print_student_msg(const PSTUDENT cpstudent) { printf("id : %u\n", cpstudent->id); printf("name : %s\n", cpstudent->name); }这段代码和上面的代码有神马区别呢?仅仅是'.'句点变为了'->'和print_student_msg函数的参数类型变成了const PSTUDENT,就是const struct student *类型,因为不需要改变cpstudent字段的值,所以在前面加上了const。为什么这段代码比前一段代码更好呢:在IA32中指针都占4字节,而STUDENT,就是struct student类型却不止,unsigned占4字节,char[9]占9字节,说明STUDENT至少占13个字节,但实际上并不是13个字节,应该是16个字节。至于为什么STUDENT类型占16字节,不在本问题范围内就不解释了。这说明如果调用前一段代码的print_student_msg函数将会入栈16字节,而调用这段代码的print_student_msg函数只会入栈4字节(不止是这个函数,所有用指针作为参数的,在IA32中都只入栈4字节),调用前一段代码的print_student_msg函数似乎只浪费了12个字节的空间,也没什么,那如果调用这个函数一千次、一万次?或着你有一个更复杂的结构体,它有很多字段,那么就更不用说了。