从函数返回时返回类型重要吗?
这是一个分为两部分的问题。 我相信8位操作将与32位操作相同。 我相信8位值是在32位寄存器中操作的,因此它将提升为32位值。然后将其强制转换为8位值。
unsigned char SomeFunc() <- Quickest and less memory.
unsigned short SomeFunc()
unsigned long SomeFunc()
“所有操作均应在最小的变量上执行,这样可以节省时间和空间”是对还是错?
在32位操作系统上,我认为这无关紧要,因为返回寄存器无论是变量还是地址,无论如何都是32位。 因此,它既不会节省时间,也不会节省空间。
我确实知道,如果这就是您要处理的所有内容,则可能需要返回一个char / byte,但是您仍然可以返回long并将其强制转换。 我认为无论您离开函数之前还是之后,您都仍然在强制转换。我几乎认为处理32位值比16或8位值更容易,更快。
第二部分。 在下面的函数中,如果我返回一个无符号的short,我相信它不会更快或更节省空间。
unsigned long SomeFunc(unsigned char a, unsigned char b);
{
unsigned long c = a + b;
return c;
}
或
unsigned long SomeFunc(unsigned char a);
{
//This will be promoted to a 32-bit value anyways.
return a & 0x1;
}
以下功能将以某种方式更快并且占用更少的内存?
unsigned char SomeFunc(unsigned char a);
{
//This will be promoted to a 32-bit value anyways.
return a & 0x1;
}
答案 0 :(得分:0)
tl; dr:信任您的优化器。不要与类型系统作斗争。
是的,您应该使用最小的类型。
根据您的编译器,它们可能会以不同的方式进行编译,并且您的编译器可能有充分的理由这样做。如果您对编译器撒谎,那是因为您对类型的优化感到困惑。
而且因为您不知道如何使用返回值。
并非所有内存都是单个变量。考虑数组和结构。它们以超出32或64位本机大小的大块分配。如果返回的类型大于必要的类型,则将强制数组或结构存储它以使用更多的内存。例如,如果返回一个int
,而应该返回一个char
,而我必须将这些值存储在数组中,则该数组将大4到8倍。
我确实知道,如果这就是您要处理的所有字符,则可能需要返回一个char / byte,但是您仍然可以返回long并将其强制转换。我认为无论您离开函数之前还是之后,您都仍然在强制转换。我几乎认为处理32位值比处理16位或8位值更容易,更快。
返回值告诉阅读代码的人使用哪种类型存储返回值。如果您习惯于使用不必要的较大类型,而只需要知道可以将哪些类型转换为较小类型,那就是您所知道的隐藏信息。而且,如果它在您的脑海中,您会忘记的。
随意铸造会破坏类型系统的安全性。类型检查可让您知道是否将错误类型或大小的数据放入错误的位置。 Casting告诉编译器“我知道这看起来不对,但是请相信我,我知道我在做什么”。仅应在必要时执行此操作。如果您进行强制转换,则会失去编译器的帮助。如果您输入有误,编译器将无法帮助您。
最后,它将使任何阅读您的代码的人迷惑不解。他们会挠头,想知道为什么您总是将多头变成短裤,将整数变成字符。他们永远不会知道哪个可以,哪个是错误。
对于unsigned long
与unsigned char
,用clang -O3 -S
编译两个函数并比较汇编会显示出一些细微差别:
- movq %rdi, %rax
+ movl %edi, %eax
unsigned char
实现将使用32位寄存器,而unsigned long
将使用64位寄存器。这有关系吗?邓诺,可能不是。绝对不足以击败类型系统。