在slice.h文件函数有inline关键字
inline bool operator==(const Slice& x, const Slice& y) {
return ((x.size() == y.size()) &&
(memcmp(x.data(), y.data(), x.size()) == 0));
}
在函数定义前加上inline关键字,可以允许该函数在多个不同的编译单元中被定义,而不违反ODR。 为什么?
inline
关键字在C++中具有两个主要作用:
-
建议编译器将函数体内联到每个函数调用点。这意味着函数调用会被替换为函数体本身的代码,从而可能减少函数调用的开销。然而,这只是一个建议,编译器可能会忽略此建议。
-
允许在多个编译单元中定义相同的函数,而不违反 One Definition Rule(ODR)。ODR是C++中的一个规则,它要求一个程序中的非内联函数、变量和类的每个实体只能有一个定义。对于内联函数,这个规则有所放宽。
当你在函数定义前加上inline
关键字时,你告诉编译器这个函数可以在不同的编译单元中重复定义,只要这些定义是相同的。编译器在处理内联函数时会保证每个定义都是相同的,并且在链接时不会因为多个定义而发生冲突。