2010-07-31 50 views
0

努力解决问题#3367795在这里所以我必须应付一些子问题。这些是一个:在所述算法(Levenshtein距离),几个阵列在内存中分配和与所述线为什么这些C/Cython数组定义为字符而不是整数数组?

cdef char *m1  = <char *>calloc( blen + 2, sizeof(char)) 
cdef char *m2  = <char *>calloc( blen + 2, sizeof(char)) 
cdef char *m3  = <char *>malloc((blen + 2) * sizeof(char)) 
#......................................................................... 
for i from 0 <= i <= blen: 
    m2[ i ] = i 
    <...snip...> 

blen这里指的是一个Python bytes可变的长度初始化。现在据我了解算法(请参阅我的原始文章的完整代码)和m2的初始化代码清楚地表明,这些数组是为了保存整数数字,而不是字符,所以人们会认为正确的分配应该看起来像

cdef int *m3  = <int *>malloc((blen + 2) * sizeof(int)) 

等等。任何有C背景的人都可以向我解释为什么使用char?另外,也许更倾向于Cython的人,为什么会有演员表<char *>?人们会认为char *x = malloc(...)应该足以定义x

回答

2

很简单,以便节省存储空间 - 但请仔细该声明这些数组作为char限制要么127或255,这取决于是否C编译器默认为分别signed charunsigned char结果距离注意。在C中,char是一个整数类型 - 你不需要ord()来获得它的整数值。

您的原始代码没有提及此限制。 请注意,如果char溢出,它会静默地执行,并且代码将产生不正确的结果 - 127 + 1 - > -128(有符号); 255 + 1 - > 0(无符号)。你没有回应我对你原来的问题的评论:“”“什么是你的字符串的(a)最大(b)平均大小?你真的需要做整个O(M * N)如果两个字符串没有什么相同之处的话?“”“......请现在回答(编辑您的问题);如果你这样做了,那么你就会有这个问题回答。

更新:重读原帖,我注意到一个问题:读

m1, m2 = m2, m1 
strcpy(m3, m2) 

是三个理由错码:(1)它不正确洗牌行(应该做的strcpy()之前交换m1m2)(2)strcpy()不会复制任何超出第一空(零字节)(3)没有必要复制任何东西,只是洗牌指针

m3, m2, m1 = m2, m1, m3 
+0

thx;您的评论对我而言不可见。我添加了一个编辑来回答这个问题。 – flow 2010-07-31 21:53:33

+0

@flow:它在您看到的评论结尾会显示(1)您将看到“显示1条评论”(2)您将被页面顶部的小信封图标通知到新评论在你的名字旁边高亮 – 2010-07-31 22:31:37

+0

你是对的。这太微妙了。 – flow 2010-08-01 22:05:23

8

尽管误导名称,char类型在C语言中是普通整体类型,就像shortintlong和这样的。在所有积分类型中,char s的范围最小,占用的内存最小。因此,如果在应用程序中尽可能节省内存非常重要,则可以使用char而不是int

在一些硬件平台可能会证明,int类型的工作速度比char类型,所以具体类型的选择变成了速度VS内存权衡,但是,再一次,在很多情况下,当范围的char自然是足够的,使用char而不是int可能更有意义。

+1

只是一个小侧面说明: C99的int_fast8_t类型(和衍生产品)将所提到的速度与大小的权衡留给实施。通常它会为您提供最少的8位(大多数系统上的一个字节,即'char')可用的最快类型。 – RWS 2010-07-31 21:46:32

+4

至少* if *这意味着一个永远不会使用的小整数,从不使用'char'作为类型,因为它的签名是未定义的,并且可能因平台而异。使用'signed char','unsigned char'或者更好的提到'int_fast8_t'或'int8_T'等。 – 2010-07-31 22:00:24

相关问题