当我尝试按原样运行此代码时,我收到编译器消息“错误:返回不兼容的类型”。我在代码中标记了错误的位置。如果我把这条线拿出来,那么编译器很高兴。
问题是我想返回一个表示函数无效输入的值(在本例中是调用f2(2)。)我只想要一个带有数据返回的结构,如果调用该函数而不使用2作为参数
我觉得唯一的两种方法是:
让函数返回一个struct指针而不是一个死对象结构但是我的调用函数看起来很有趣,因为我必须将yb更改为y-> b并且由于额外的操作可能会更慢在内存中获取数据的步骤。
分配额外内存,填充零字节,并将返回值设置为内存中该位置的结构。 (例如:WebDriverWait
而不是return x[nnn];
)。这种方法将使用更多内存和一些处理来对其进行零字节填充。
最终,我正在寻找一种从长远来看最快,最干净(在代码方面)的解决方案。如果我不得不坚持使用return x[0];
来解决元素成员的问题,那么我想这就是要走的路。
有没有人有一个使用最少cpu功率的解决方案?
->
答案 0 :(得分:4)
如果你关心速度,那就是特定于实现。
请注意,Linux x86-64 ABI定义struct
个两个(确切地说)标量成员(即整数,双精度数或指针,它们都适合单个机器寄存器 - 但不是struct
等......它们是聚合数据)通过两个寄存器返回(不通过堆栈),这非常快。
顺便说一句
if (set==2){return NULL;} //wrong
显然是错的。你可以编码:
if (set==2) return (aa){0,0};
此外,
ab* x=(ab*)dat; // suspicious
对我来说很可疑(因为你后来return x[0];
)。您不能保证dat
适当对齐(例如8或16字节),并且在某些平台(特别是x86-64)上如果dat
未对齐,您至少会失去性能(实际上,它是undefined behavior)。
BTW,我建议您始终返回return (aa){l,c};
之类的说明(其中l
是一个可转换为long
的表达式,而c
是一个可转换为{{1}的表达式}});这可能是最容易阅读的,并且将被优化以加载两个返回寄存器。
当然,如果您关心性能,出于基准测试的目的,您应该启用优化(和警告),例如:如果使用GCC,则使用char
进行编译;在我的系统(Linux / x86-64与GCC 5.2)上的小功能
gcc -Wall -Wextra -O2 -march=native
编译(带 ab give_both(long x, char y)
{ return (ab){x,y}; }
)到:
gcc -O2 -march=native -fverbose-asm -S
你看到所有代码都在使用寄存器,根本没有使用内存..
答案 1 :(得分:1)
我会将返回值用作错误代码,调用者会将指针传递给他的.health-description {
display: inline-block;
transform: translate(0, -30%);
}
,例如:
struct