在最快的Cortex M0 + Thumb 32x32 = 64乘法功能的问题上工作?我写了下面的C函数来看看它是如何编译的:
uint64_t lmul(uint32_t a, uint32_t b){
uint32_t hia = a >> 16,
hib = b >> 16,
loa = (uint32_t)(uint16_t)a,
lob = (uint32_t)(uint16_t)b,
low = loa * lob,
mid1 = hia * lob,
mid2 = loa * hib,
mid = mid1 + mid2,
high = hia * hib;
if (mid < mid1)
high += 0x10000;
return ((uint64_t)high << 32) + ((uint64_t)mid << 16) + low;
}
Run Code Online (Sandbox Code Playgroud)
在使用ARM GCC编译器4.7.3通过CodeWarrior(我正在使用的Freescale开发板附带)进行大小优化编译之后,它变成了:
00000eac <lmul>:
eac: b570 …Run Code Online (Sandbox Code Playgroud) 我正在使用OpenGL开发数据可视化工具,LAB颜色空间是我可以处理的数据可视化最容易理解的颜色空间(3轴数据被映射到颜色空间的3个轴).是否存在快速(例如,没有非整数求幂,适合在着色器中执行)算法,用于将LAB值近似转换为RGB值和从RGB值转换?
algorithm colors color-space pixel-shader function-approximation
我正在调查Python缓冲区界面,看它是否有助于优化我的项目.我的项目处理大型二进制数据文件,这两个数据文件都占用了不可靠的内存以保留在内存中(当解压缩到Python数据结构时它们可以是多个gigs)并且需要花费太多时间来按需解压缩(20-30秒完全或迭代解压).相比之下,文件足够小(数十或数百兆)以二进制形式完全存储在内存中(或者必要时通过内存映射页面存储),并且结构化使得它们需要最少的解包来从例如C使用.
我一直在阅读有关缓冲区的一些内容,例如在PEP中,但有一些事情我不清楚使用它们以原生形式存储结构:
C 有没有通用的方法来屏蔽宏参数中的注释?我知道括号可以用于此目的,但在添加括号导致宏输出中出现语法错误的情况下,这将不起作用。我听说 ({ }) 可以在 GCC 中屏蔽逗号,但我需要此代码也可以在 VC++ 中工作(最新版本之一,在宏中的逗号方面确实符合 C 标准)。在我的例子中,我也不能使用可变参数宏。
我想要做的具体情况是这样的(lengthof 是在其他地方定义的宏)。我正在尝试为整个事情编写一个宏,因为这将被多次使用,并且拥有多宏解决方案将添加大量额外的测试代码。
#define TEST_UNFUNC(func, res_type, res_set, op_type, op_set) \
{ \
static const res_type res[] = res_set; \
static const op_type op[] = op_set; \
int i; \
for (i = 0; i < MIN(lengthof(res), lengthof(op)); i++) \
assert(func(op[i]) == res[i]); \
}
Run Code Online (Sandbox Code Playgroud)
如果可能的话,我想要一个一般性的答案,而不仅仅是特定于这个特定宏的解决方法。
mem___函数例如memset是以字节还是字符为单位的长度?到目前为止我所看到的所有内容都表明了字节数,但是我最近一直在使用的具有16位字符的TI DSP的CRT占用了字符大小.这是C语言深层次的黑暗角落(就像sizeof实际上返回字符大小的事实一样),还是TI的实现是非标准的?
c ×3
algorithm ×1
arm ×1
assembly ×1
color-space ×1
colors ×1
cpython ×1
gcc ×1
macros ×1
pixel-shader ×1
python ×1
python-3.x ×1