小编rle*_*lut的帖子

如果在for循环中使用<或<=

如果你不得不循环7次循环,你会使用:

for (int i = 0; i < 7; i++)
Run Code Online (Sandbox Code Playgroud)

要么:

for (int i = 0; i <= 6; i++)
Run Code Online (Sandbox Code Playgroud)

有两个注意事项:

  • 性能
  • 可读性

为了性能,我假设Java或C#.使用"小于"或"小于或等于"是否重要?如果您对其他语言有所了解,请说明哪些语言.

为了便于阅读,我假设基于0的数组.

UPD:我提到的基于0的数组可能会让人感到困惑.我不是在讨论迭代数组元素.只是一个循环.

关于使用常数可以解释这个神奇数字是什么,下面有一个好点.所以,如果我有" int NUMBER_OF_THINGS = 7"然后" i <= NUMBER_OF_THINGS - 1"看起来很奇怪,不会.

performance readability conventions

122
推荐指数
9
解决办法
3万
查看次数

C/C++编译器警告:您是否清理了所有代码以将其删除或保留?

我参与了很多项目,其他人已经给了别人更新的代码.我经常编译它并获得大约1,000多个编译器警告.当我看到编译器警告时他们让我觉得很脏,所以我的第一个任务是清理代码并将它们全部删除.通常我发现大约十几个问题,比如未初始化的变量.

我不明白为什么人们把它们留在里面并且没有完全干净的编译而没有任何警告.我错过了什么吗?是否有正当理由离开他们?分享任何恐怖故事?

c c++ compiler-construction warnings

63
推荐指数
9
解决办法
1万
查看次数

使用现代编译器在C++中使用"memset"功能的状态

语境:

不久之前,我偶然发现了Alexandrescu的2001年DDJ文章:http: //www.ddj.com/cpp/184403799

它是关于比较各种方法来初始化缓冲区到某个值.就像"memset"对单字节值的作用一样.他比较了各种实现(memcpy,显式"for"循环,duff的设备),并没有真正找到所有数据集大小和所有编译器的最佳候选者.

引用:

所有这一切都有一个非常深刻和悲伤的认识.我们是在2001年,即Space Odyssey的一年.(...)开箱即用,看看我们 - 50年后,我们仍然不擅长填充和复制记忆.

题:

  1. 有没有人有关于这个问题的最新信息?最近的GCC和Visual C++实现是否比7年前表现更好?
  2. 我正在编写具有5年(可能超过10年)的生命周期的代码,它将处理数组的大小从几个字节到几百兆字节.我不能假设我现在的选择在5年内仍然是最优的.我该怎么办:
    • a)使用系统的memset(或等效的)并忘记最佳性能或假设运行时和编译器将为我处理这个问题.
    • b)在各种数组大小和编译器上一劳永逸地进行基准测试,并在几个例程之间在运行时切换.
    • c)在程序初始化时运行基准测试,并在运行时根据准确的(?)数据进行切换.

编辑:我正在研究图像处理软件.我的数组项目是POD,每毫秒都很重要!

编辑2:感谢您的第一个答案,这里有一些额外的信息:

  • 缓冲区初始化可能占某些算法总运行时间的20%-40%.
  • 该平台可能在未来5年内有所不同,尽管它将保持"最快的CPU可以从DELL购买"类别.编译器将是某种形式的GCC和Visual C++.雷达上没有嵌入式东西或异国情调的架构
  • 我想听听那些在MMX和SSE出现时不得不更新软件的人,因为当"SSE2015"可用时我将不得不这样做...... :)

c c++ memory optimization

19
推荐指数
4
解决办法
5420
查看次数

检查向量是否已排序的最佳算法

检查a std::vector是否排序的最佳方法是什么?有没有比循环检查更快的东西v[i]<=v[i+1]?迭代器更快/更清洁吗?或者sort每次调用实际上更好(虽然"v已经排序"的情况很常见)?

我们可以安全地假设向量只包含POD,通常是floats,有时double是s和ints.

向量的大小是非平凡的(通常是几千个项目),但不是极端的(不是千兆字节大小).

  • 在某些情况下,我们会在之后立即对矢量进行排序,但是还有其他情况我们不会(这是我们算法的错误情况).
  • 我们已尽可能使用标志"IsSorted".

c++ algorithm optimization vector

18
推荐指数
6
解决办法
1万
查看次数

正确替换C++中缺少的'finally'

由于finally在C++中没有,你必须使用RAII设计模式,如果你希望你的代码是异常安全的.一种方法是使用像这样的本地类的析构函数:

void foo() {
    struct Finally {
        ~Finally() { /* cleanup code */ }
    } finalizer();
    // ...code that might throw an exception...
}
Run Code Online (Sandbox Code Playgroud)

与直接解决方案相比,这是一个很大的优势,因为您不必编写清理代码2次:

try {
    // ...code that might throw an exception...
    // cleanup code (no exception)
} catch (...) {
    // cleanup code (exception)
    throw;
}
Run Code Online (Sandbox Code Playgroud)

本地类解决方案的一大缺点是您无法直接访问清理代码中的局部变量.因此,如果您需要访问它们,它会使您的代码膨胀很多,无论如何:

void foo() {
    Task* task;
    while (task = nextTask()) {
        task->status = running;
        struct Finally {
            Task* task;
            Finally(Task* task) : task(task) {}
            ~Finally() { task->status …
Run Code Online (Sandbox Code Playgroud)

c++ exception finally c++-faq

11
推荐指数
3
解决办法
6769
查看次数