面试题答案
一键面试优化思路
- 分析性能瓶颈:使用性能分析工具(如 gprof 等)确定
module1.c
中具体哪些函数存在性能瓶颈,明确优化的目标函数。 - 头文件组织:确保
module2.h
对module1.h
的依赖关系正确,避免重复包含。使用#ifndef
、#define
、#endif
或者#pragma once
来防止头文件被多次包含。 - 函数声明与定义调整:在优化函数时,保证函数的接口不变,即
module1.h
中的函数声明不能改变,以免影响module2.c
的正常使用。在module1.c
中对性能瓶颈函数进行优化实现。 static
关键字控制:在头文件中使用static
关键字可以定义内部链接的函数或变量,限制其作用域,避免命名冲突,同时在一定程度上优化代码空间和性能。
关键代码示例
- 头文件组织
module1.h
#ifndef MODULE1_H
#define MODULE1_H
// 数据结构定义
typedef struct {
int data;
} MyStruct;
// 函数声明
void module1_function1(MyStruct *obj);
void module1_function2(MyStruct *obj);
#endif
- `module2.h`
#ifndef MODULE2_H
#define MODULE2_H
// 包含 module1.h
#include "module1.h"
// module2 自己的数据结构和函数声明
typedef struct {
MyStruct inner_obj;
int other_data;
} Module2Struct;
void module2_function(Module2Struct *obj);
#endif
- 函数声明与定义调整
module1.c
#include "module1.h"
#include <stdio.h>
// 优化前的函数
void module1_function1(MyStruct *obj) {
// 旧的实现,性能瓶颈处
for (int i = 0; i < 1000000; i++) {
obj->data += i;
}
}
// 优化后的函数
void module1_function1(MyStruct *obj) {
// 新的优化实现
int sum = 0;
for (int i = 0; i < 1000000; i++) {
sum += i;
}
obj->data += sum;
}
void module1_function2(MyStruct *obj) {
// 其他函数实现
printf("Data in module1_function2: %d\n", obj->data);
}
- `module2.c`
#include "module2.h"
#include <stdio.h>
void module2_function(Module2Struct *obj) {
module1_function1(&obj->inner_obj);
printf("Data after module1_function1 in module2: %d\n", obj->inner_obj.data);
module1_function2(&obj->inner_obj);
}
static
关键字在头文件中的使用module1.h
#ifndef MODULE1_H
#define MODULE1_H
// 数据结构定义
typedef struct {
int data;
} MyStruct;
// 函数声明
void module1_function1(MyStruct *obj);
void module1_function2(MyStruct *obj);
// 使用 static 定义内部函数
static void internal_helper_function(MyStruct *obj) {
// 内部辅助函数实现
obj->data *= 2;
}
#endif
这样,internal_helper_function
仅在包含该头文件的源文件内可见,不会与其他源文件中的同名函数冲突。同时,在 module1.c
中使用 internal_helper_function
时,可以像下面这样:
#include "module1.h"
#include <stdio.h>
void module1_function1(MyStruct *obj) {
// 调用内部辅助函数
internal_helper_function(obj);
// 其他操作
}
void module1_function2(MyStruct *obj) {
// 其他函数实现
printf("Data in module1_function2: %d\n", obj->data);
}