【问题标题】:C++ function parameters or parameter arrayC++ 函数参数或参数数组
【发布时间】:2013-10-28 23:26:50
【问题描述】:

我的背景和直觉告诉我,我应该始终通过要求这样的参数为函数创建一个更紧密、更明确的接口:

bool someFunc(int param1, int param2, char param3, float param4) {
   ...
}

或需要一个对象(结构或类),例如:

class someObject {
    ...
    int p1;
    int p2;
    char c1;
    float p4;
}

我的老板告诉我应该使用类似的东西:

bool someFunc(void *params[], int size) {
   ...
}

因为它创建了更多可扩展性(您可以通过这种方式迭代参数)和更快的代码。

我只对提高自己的能力感兴趣,但我的直觉与这种方法背道而驰。他说的对吗?

【问题讨论】:

  • 你不能迭代params。你的意思是写bool someFunc(void* params[]) 或类似的东西(你还需要知道参数的数量)?如果是这样,如果它比按值传递内置类型更快,我会感到相当惊讶。
  • programmers.stackexchange.com 发布这个问题你可能会得到更多关注:-)
  • @DietmarKühl - 是的,我的意思是,谢谢。已更新以反映。
  • Dirtmar 的 cmets 排名第二。您不能取消引用 void* 而不将其转换回真实类型。另外,输入参数是一个没有长度的指针数组,所以你也不知道数组的大小。
  • @tonga - 你说得对,他的实现也需要参数的数量。已更新以反映。

标签: c++ performance


【解决方案1】:

可怕的想法。我无法在一个答案中列出它不好的原因,但主要问题是它不起作用。举个简单的例子,你不能传 3,如果你传 0,它就变成了一个 nullptr。更重要的是,无论如何您都必须将值转换回给定类型,那么为什么不在签名中指定类型呢?

现在有一个真正的 C++ 替代方案,可变参数模板:

template<typename... Arguments>
void Foo(Arguments... parameters);

在这种情况下,编译器将知道Arguments... 中的所有类型,无需转换任何内容。

【讨论】:

  • 您是正确的,我必须将类型转换回来,建议我通过将每个参数的类型作为参数中的另一个数组传递来做到这一点。我以前从未见过或使用过可变参数模板,但我从阅读它们中学到了很多东西(谢谢)。不幸的是,我们的编译器还不允许使用 c++11 功能。
【解决方案2】:

我不同意上述答案,您的直觉是正确的,您应该尝试为函数创建显式接口。有时你不能有一个显式的接口,然后你应该考虑可变参数模板参数,但它们很少见。 char 和 float 两个 Ints 看起来是一个完全合理的函数参数。

然而,你的处境非常棘手,你不想与你的老板作对。我会对他的任何编程建议持怀疑态度,他要么不是一个很好的程序员,要么是那些老派的 hacky c 程序员之一(看看他是否到处都使用 MACROS)。我的建议是现在就按照他的方式进行操作,然后如果您以后再次使用该功能,请修复它并尝试让其他人检查您的代码。

【讨论】:

  • 感谢您的建议和验证。我处于您概述的非常棘手的情况,我打算编写我能写的最好的代码,即使这些是让我被解雇的理由(我找到另一份工作没有问题)。我只是不够成熟,无法确定我什么时候是对的,或者他什么时候是对的——因此是这个职位。我想学习正确的答案,我会实现它。
【解决方案3】:

你的老板疯了。这种放荡在 C 中占有一席之地,即使在那里你也会使用varargs,而不是这个疯狂的结构。如果您想使用动态类型语言进行编程,请不要使用 C++,或者使用变体类型的数组(例如 boost::variantQVariant)。

您的老板正在寻找但显然缺少的“可扩展性”被称为函数/方法重载。它作为适当设计的一部分,而不是作为法令的一部分。

【讨论】:

  • 我在每一点上都同意你的观点,除了我工作的地方很遗憾我们负担不起使用诸如 boost 甚至 STL 之类的东西的费用。
  • @user2705235:所以,你的老板认为你自己的由 C++ 经验少得多的人完成的自制解决方案会比boost::variant 更好?是的,祝你好运。诸如boost 之类的流行库的好处是许多挑剔者试图通过发现问题来炫耀自己。 boost::variant 之类的东西通常会多次优化到地狱并返回。
猜你喜欢
  • 1970-01-01
  • 2011-02-21
  • 2017-02-19
  • 2020-06-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多