在构建不断增长的类/函数库时,我经常看到一种“伞”头文件,它 #includes 项目的所有常见头文件。例如:
dsp.h
#include "file1.h"
#include "file2.h"
...
#include "filex.h"
Run Code Online (Sandbox Code Playgroud)
有时我可能需要一切,但其他时候可能只需要选择一些功能/选项。例如,如果 #include dsp.h,但不使用 file2.h 中的任何内容,编译器知道吗?是否有可能在构建中对其进行优化?
否则,我的解决方案是将可选代码包装在预处理器指令中,然后定义我需要的内容。也许这是一个更安全、更有效的解决方案?
我正在考虑优化从 CGImage 获取像素数据的例程。目前这样做的方式(非常低效)是创建一个新的 CGContext,将 CGImage 绘制到上下文中,然后从上下文中获取数据。
我有以下优化的例程来处理这个问题:
CGImageRef imageRef = image.CGImage;
uint8_t *pixelData = NULL;
CGDataProviderRef imageDataProvider = CGImageGetDataProvider(imageRef);
CFDataRef imageData = CGDataProviderCopyData(imageDataProvider);
pixelData = (uint8_t *)malloc(CFDataGetLength(imageData));
CFDataGetBytes(imageData, CFRangeMake(0, CFDataGetLength(imageData)), pixelData);
CFRelease(imageData);
Run Code Online (Sandbox Code Playgroud)
这几乎有效。通过查看和比较两种方法得到的像素数据的hex dump,我发现在上面的例子中,每6360个字节就有8个字节是0。否则,数据是相同的。例如

这是与未优化版本的比较:

在 0 的 8 个字节之后,正确的像素数据继续。有谁知道为什么会这样?
更新:这是我正在优化的例程(剪下的代码只是获取大小信息和其他不重要的东西;相关位是返回的像素数据):
CGContextRef context = NULL;
CGImageRef imageRef = image.CGImage;
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
CGBitmapInfo bitmapInfo = kCGBitmapByteOrder32Little | kCGImageAlphaPremultipliedFirst;
// ... SNIP ...
context = CGBitmapContextCreate(...);
CGColorSpaceRelease(colorSpace);
// ... SNIP ...
CGContextDrawImage(context, rect, imageRef);
uint8_t *pixelData = (uint8_t *)CGBitmapContextGetData(context);
CGContextRelease(context); …Run Code Online (Sandbox Code Playgroud)