返回类型是否节省空间或时间

时间:2019-04-04 22:27:19

标签: c types casting return cpu-registers

从函数返回时返回类型重要吗?

这是一个分为两部分的问题。 我相信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;
}

1 个答案:

答案 0 :(得分:0)

tl; dr:信任您的优化器。不要与类型系统作斗争。


是的,您应该使用最小的类型。

根据您的编译器,它们可能会以不同的方式进行编译,并且您的编译器可能有充分的理由这样做。如果您对编译器撒谎,那是因为您对类型的优化感到困惑。

而且因为您不知道如何使用返回值。

并非所有内存都是单个变量。考虑数组和结构。它们以超出32或64位本机大小的大块分配。如果返回的类型大于必要的类型,则将强制数组或结构存储它以使用更多的内存。例如,如果返回一个int,而应该返回一个char,而我必须将这些值存储在数组中,则该数组将大4到8倍。

  

我确实知道,如果这就是您要处理的所有字符,则可能需要返回一个char / byte,但是您仍然可以返回long并将其强制转换。我认为无论您离开函数之前还是之后,您都仍然在强制转换。我几乎认为处理32位值比处理16位或8位值更容易,更快。

返回值告诉阅读代码的人使用哪种类型存储返回值。如果您习惯于使用不必要的较大类型,而只需要知道可以将哪些类型转换为较小类型,那就是您所知道的隐藏信息。而且,如果它在您的脑海中,您会忘记的。

随意铸造会破坏类型系统的安全性。类型检查可让您知道是否将错误类型或大小的数据放入错误的位置。 Casting告诉编译器“我知道这看起来不对,但是请相信我,我知道我在做什么”。仅应在必要时执行此操作。如果您进行强制转换,则会失去编译器的帮助。如果您输入有误,编译器将无法帮助您。

最后,它将使任何阅读您的代码的人迷惑不解。他们会挠头,想知道为什么您总是将多头变成短裤,将整数变成字符。他们永远不会知道哪个可以,哪个是错误。


对于unsigned longunsigned char,用clang -O3 -S编译两个函数并比较汇编会显示出一些细微差别:

-   movq    %rdi, %rax
+   movl    %edi, %eax

unsigned char实现将使用32位寄存器,而unsigned long将使用64位寄存器。这有关系吗?邓诺,可能不是。绝对不足以击败类型系统。