小编Jus*_*ntz的帖子

ARM故意膨胀编译代码?

在最快的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)

c assembly gcc arm compiler-optimization

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

RGB/LAB转换的快速近似算法?

我正在使用OpenGL开发数据可视化工具,LAB颜色空间是我可以处理的数据可视化最容易理解的颜色空间(3轴数据被映射到颜色空间的3个轴).是否存在快速(例如,没有非整数求幂,适合在着色器中执行)算法,用于将LAB值近似转换为RGB值和从RGB值转换?

algorithm colors color-space pixel-shader function-approximation

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

Python缓冲区,它们如何工作?

我正在调查Python缓冲区界面,看它是否有助于优化我的项目.我的项目处理大型二进制数据文件,这两个数据文件都占用了不可靠的内存以保留在内存中(当解压缩到Python数据结构时它们可以是多个gigs)并且需要花费太多时间来按需解压缩(20-30秒完全或迭代解压).相比之下,文件足够小(数十或数百兆)以二进制形式完全存储在内存中(或者必要时通过内存映射页面存储),并且结构化使得它们需要最少的解包来从例如C使用.

我一直在阅读有关缓冲区的一些内容,例如在PEP中,但有一些事情我不清楚使用它们以原生形式存储结构:

  1. 我知道缓冲区有关联的Struct样式格式定义,但是它们在访问时究竟在哪里转换为Python版本?Python是根据格式定义自动执行此操作,还是缓冲区导出器是通过getitem还是其他方式执行此操作?
  2. 使用缓冲区导出器存储大型C结构数组可以获得多少性能?例如迭代整个文件需要花费与使用Struct.unpack解压缩整个文件相同的时间,或者通过各种优化更有效(例如,如果您只是解压缩单个结构元素,如果您没有访问其他文件)在那个结构内)?
  3. 在元素访问期间是否可以对奇数数据类型进行自动转换?具体来说,这些文件格式中的一些喜欢使用奇长整数(例如5个字节长)以避免使用固定大小的较大整数类型.这可以透明有效地转换,或者在分配实际缓冲区以符合Struct定义时,我是否必须在导出器中将其转换为固定大小?

python cpython python-3.x

5
推荐指数
0
解决办法
102
查看次数

C:如何屏蔽宏参数中的逗号?

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)

如果可能的话,我想要一个一般性的答案,而不仅仅是特定于这个特定宏的解决方法。

c macros c-preprocessor

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

mem___:字节或字符

mem___函数例如memset是以字节还是字符为单位的长度?到目前为止我所看到的所有内容都表明了字节数,但是我最近一直在使用的具有16位字符的TI DSP的CRT占用了字符大小.这是C语言深层次的黑暗角落(就像sizeof实际上返回字符大小的事实一样),还是TI的实现是非标准的?

c

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