小编Chr*_*ris的帖子

C++ 编译器是否优化掉未使用的#include?

在构建不断增长的类/函数库时,我经常看到一种“伞”头文件,它 #includes 项目的所有常见头文件。例如:

dsp.h
#include "file1.h"
#include "file2.h"
...
#include "filex.h"
Run Code Online (Sandbox Code Playgroud)

有时我可能需要一切,但其他时候可能只需要选择一些功能/选项。例如,如果 #include dsp.h,但不使用 file2.h 中的任何内容,编译器知道吗?是否有可能在构建中对其进行优化?

否则,我的解决方案是将可选代码包装在预处理器指令中,然后定义我需要的内容。也许这是一个更安全、更有效的解决方案?

c++ optimization include c-preprocessor

2
推荐指数
1
解决办法
784
查看次数

从 CGImageRef 获取像素数据包含额外的字节?

我正在考虑优化从 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)

core-graphics bitmap cgimage ios

1
推荐指数
1
解决办法
1055
查看次数