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

问题描述 投票:0回答:1

从函数返回时返回类型是否重要?

这是一个由两部分组成的问题。我相信8位操作与32位操作相同。我相信在32位寄存器中操作一个8位值,因此它将被提升为32位值。然后它将被转换回8位值。

unsigned char SomeFunc()   <- Quickest and less memory.
unsigned short SomeFunc()
unsigned long SomeFunc()

“所有操作都应尽可能在最小的变量上执行,这样可以节省时间和空间”是真还是假?

在32位操作系统上,我认为这不重要,因为返回寄存器无论如何都是32位,无论是变量还是地址。所以它既不会节省时间,也不会节省空间。

我确实理解可能需要返回一个字符/字节,如果这是你所有的处理,但你仍然可以返回一个长并投出它。无论是在离开函数之前还是之后,我认为你仍然无论如何都要投入。我几乎认为处理32位值比16位或8位值更容易,更快。

第二部分。在下面的函数中,如果我要返回一个unsigned 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;
}
c types casting return cpu-registers
1个回答
0
投票

tl; dr:相信你的优化器。不打击类型系统。


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

根据您的编译器,它们可能以不同的方式编译,您的编译器可能有充分的理由这样做。如果你骗你的编译器关于你正在搞乱其优化代码的能力的类型。

因为你不知道如何使用返回值。

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

我确实理解可能需要返回一个字符/字节,如果这是你所有的处理,但你仍然可以返回一个长并投出它。无论是在离开函数之前还是之后,我认为你仍然无论如何都要投入。我几乎认为处理32位值比16位或8位值更容易,更快。

返回值告诉人们读取代码用于存储返回值的类型。如果你习惯性地使用比必要的更大的类型,只需要知道哪些类型可以转换为更小的类型,那只有你知道的隐藏信息。如果它在你的头脑中,你会忘记。

无偿铸造会破坏类型系统的安全性。类型检查会告诉您是否将错误类型或大小的数据放入错误的位置。 Casting告诉编译器“我知道这看起来不错,但相信我,我知道我在做什么”。这应该只在必要时进行。如果您无偿投射,则会失去编译器的帮助。如果你犯了一个错误,编译器无法帮助你。

最后,任何人都会阅读您的代码。他们会抓挠他们的头脑,并想知道为什么你总是把多头换成短裤和一口气。他们永远不会知道哪些是好的,哪些是错误的。


至于unsigned long vs unsigned char,使用clang -O3 -S编译你的两个函数并对程序集进行差异显示出一点点差别:

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

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

© www.soinside.com 2019 - 2024. All rights reserved.