不管是IA32还是IA64架构,大多数的编译器都会帮我们优化代码,比如:

程序代码:
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个字节的空间,也没什么,那如果调用这个函数一千次、一万次?或着你有一个更复杂的结构体,它有很多字段,那么就更不用说了。
当然我不明白为什么TonyDeng会说这跟CPU的内核个数有关,不管CPU如何调度,代码量就已经固定了,每条代码都应该得到执行。