【问题标题】:What type should I use for an index variable我应该为索引变量使用什么类型
【发布时间】:2010-10-27 15:51:05
【问题描述】:

这是一个最佳实践问题。我正在做一个数组

type * x = malloc(size*sizeof(type));

AFAIK sizeof 给出 size_t 的返回值。这是否意味着我应该使用 size_t 来声明或传递大小?此外,在索引数组时,我还应该使用 size_t 作为索引变量吗?这些的最佳实践是什么?这不是他们在学校教的东西,现在我正在学习严肃的 c++ 我想知道。

另外,如果有人提到我可以在哪里找到这类东西的最佳实践,那会有所帮助吗?一种程序员的礼仪书籍。

编辑: malloc 应该是 cudaHostAlloc 或 cudaMalloc,因为我正在开发一个在设备和主机上同时存储数组并同时更新两者的类。所以这里的 malloc 只是我实际要做的事情的占位符。

【问题讨论】:

  • 一个好的“最佳实践”是将sizeof与正在使用的变量一起使用:type * x = (type*) malloc( size*sizeof *x );这样,如果您稍后更新左侧大小中的类型,则无需更新右侧手边 (sizeof(type))
  • C++ 的最佳实践是不要使用malloc()。你为什么用它?
  • 我在问题中编辑了 malloc 只是一个占位符,以表明我正在动态分配内存。在最终实现中,我将使用 cuda 接口来获取固定内存和 gpu 内存。所以不,我不会真正使用 malloc,但我实际要做的事情比问题要求的要复杂。

标签: c++ cuda


【解决方案1】:

一般来说,我会尽量减少隐式或显式转换和警告错误的数量。通常有一个很好的理由,为什么事情是按它们原来的方式输入的。 size_t 是数组索引的好选择,因为它是 unsigned,而您通常不想访问 myarray[-1]。

顺便说一句,因为这是 C++,你应该改掉使用 malloc (free) 的习惯,它是 CRT(C 运行时库)的一部分。使用new (delete),最好使用smart pointers,以尽量减少手动内存处理。

一旦您掌握了基础知识,好的做法参考(特定于语言)是Effective C++ by Scott Meyers。合乎逻辑的下一步是Effective STL。

【讨论】:

  • 使用 int 作为索引的一个优点是您可以向下迭代并有一个终止条件来检查索引是否 >= 0。
  • True - 或者,您可以使用 array::rbegin() 和 array::rend()
  • @steve - 如果你已经掌握了使用“智能”数组而不是原始类型的最佳实践。
  • @Noah - 即使没有它,也可以(并且更快)使用指针算术而不是索引。许多 STL 算法也适用于指针范围。
  • 我同意这一点。不幸的是,我不相信反向迭代器需要一个指针->迭代器包装器。我也不是 100% 确定从标准的 POV 迭代到比数组的开头少一个是可以的。我似乎记得某处某处的一次大讨论导致某些架构实际上可能在 first-1 和 last+2 方面存在问题。不过,对于大多数目的,我怀疑这很重要。
【解决方案2】:

关于您的后续问题:

我用于一般高级编程“当前良好实践”之类的最佳参考是:

Code Complete by Steve McConnell (ISBN 0-7356-1967-0)

我一直引用它。当我的公司正式制定其编码标准时,我根据它编写了它们。它没有过多地涉及设计或体系结构,但对于实际编写代码,这本书的名字很合适。

【讨论】:

  • 问题的结尾说:“另外,如果有人参考了我在哪里可以找到这类东西的最佳实践,那会有所帮助吗?程序员的礼仪书。”这是我提供的。我没有意识到我们应该坚持问题的标题,而不是回答后续问题。
【解决方案3】:

cudaMalloc 采用 size_t 类型的大小,因此为了保持一致性,您应该将其用于索引。

【讨论】:

    【解决方案4】:

    好吧,既然您已经放弃了使用 malloc 的最佳实践,甚至是 GOOD 实践......为什么它真的很重要?

    也就是说,我通常使用 size_t ,除非我需要一种可以在各种半罕见条件下变为负数的类型。

    【讨论】:

      【解决方案5】:

      我更喜欢 int 而不是 size_t 有几个原因:

      1. 应该首选原始类型,除非 typedef 提供了一些根本上新的东西,size_t 这里没有
      2. size_t 在不同系统上的定义不同,可能会给一些开发者带来惊喜
      3. 签名int 避免了for (size_t i=9; i>=0; --i) 错误,以及条件句中的其他错误,例如if (result < 1) 或 if ((i-2)/2 < 1)

      size_t 是一个无用的抽象,它通过抑制下溢来掩盖不良行为

      【讨论】:

      • 1. size_t 是原始类型的标准化 typedef。 2. int 也因系统而异。 3. 当你为无符号类型说i >= 0 时,一个好的编译器会警告你。 int 通过静默溢出来掩盖不良行为。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-01-12
      • 1970-01-01
      • 1970-01-01
      • 2016-06-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多