我目前正在尝试在C中实现trie,以便进行拼写检查(字典取自加载到trie结构中的文本文件)。
这是我当前的节点结构(取自https://www.cs.bu.edu/teaching/c/tree/trie/):
typedef struct trieNodeTag
{
char key;
struct trieNodeTag *next, *children;
} trieNodeT;
key
是要在内存中加载的每个单词的字母。
我的问题如下:对内存/速度有什么影响使用int类型的密钥? char是否直接作为int处理?
谢谢!
答案 0 :(得分:2)
由于char
之后是两个指针,struct
将next
获得children
和int
正确的对齐。假设key
的大小小于或等于系统上指针的大小,声明int
struct
不会改变<SetupEntryPoint>
<ExeHost>
<Program>setup.bat</Program>
<Arguments></Arguments>
</ExeHost>
</SetupEntryPoint>
的内存要求
就速度而言,很有可能你不会在任何方面看到太大的差异。一个好的实用方法是选择最适合程序逻辑的类型,并且只有在分析表明它会产生很大差异时才将其更改为其他类型。
答案 1 :(得分:1)
int
的行为是否与char
不同,也取决于平台。类型int
可能是机器字,更容易解决;但是,char
的内存大小可能会更小。
答案 2 :(得分:1)
我的问题如下:对内存/速度有什么影响,使用int类型的密钥?
如果您将struct trieNodeTag
成员的类型从key
修改为{{1},那么char
的大小可能会保持不变,但不确定因为编译器可能会放置该结构,以便指针int
从结构开头的偏移量是四个字节的倍数。如果您想确切知道,请将next
运算符应用于每个版本的结构,并比较结果。结果将在某种程度上取决于您使用的C实现。
是否将char直接视为int?
在对大多数表达式的求值中,类型sizeof()
的操作数在被操作之前被提升为char
。这很便宜,甚至可能是免费的,但不是,int
不会将直接视为char
。
总的来说,如果代码在键入int
或int
时同样正确,那么您应该会发现两者之间的性能差异很小或没有。
char
和int
类型之一可能更适合成员char
的预期使用。我猜这是key
,但不管是哪个,都是使用它的人。努力编写有意义且正常工作的代码。使用适当的算法来完成任务,但除非您衡量您的表现并发现它缺乏,否则不要扼杀精细的表现细节。