小编Bal*_*ckk的帖子

用于捕获未分配的r值的编译器选项

相当尴尬的是,我写了类似下面的东西(消毒过):

vector_item next()
{
    if (this->it == this->myVector.end()){
        this->it == this->myVector.begin();
    }
    return *(this->it++);
}
Run Code Online (Sandbox Code Playgroud)

明显的错误很明显.然而,它确实需要一段时间来追踪.

没有为此生成编译器警告,但是应该有吗?在这里创建了一个未使用的r值(并且不是说,来自为其副作用调用的函数的未使用的返回值),这在我看来是代码存在问题的指示器.

编译g++ -Wall -Wextra.(GCC 4.8.3)

我知道,-Wunused-result但这不适用于此.

c++ gcc return-value compiler-warnings

8
推荐指数
1
解决办法
122
查看次数

GCC 的尾调用优化有多“智能”?

我刚刚进行了一次讨论,讨论了以下两段 C 代码:

For 循环:

#include <stdio.h>
#define n (196607)

int main() {
  long loop;
  int count=0;
  for (loop=0;loop<n;loop++) {
    count++;
  }
  printf("Result = %d\n",count);

  return 0;
}
Run Code Online (Sandbox Code Playgroud)

递归:

#include <stdio.h>
#define n (196607)

long recursive(long loop) {
  return (loop>0) ? recursive(loop-1)+1: 0;
}

int main() {
  long result;
  result = recursive(n);
  printf("Result = %d\n",result);
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

看到这段代码时,我看到并想到“啊,这不是尾部调用递归”,因为它在调用完成recursive(loop-1)+1后还有工作要做;recursive它需要增加返回值。

果然,在没有优化的情况下,递归代码会触发堆栈溢出,正如您所期望的那样。

然而,使用该-O2标志,不会遇到堆栈溢出,我认为这意味着堆栈被重用,而不是将越来越多的内容推入堆栈 - 这就是 tco。

GCC 显然可以检测到这个简单的情况(+1 返回值)并对其进行优化,但是它能走多远?

当递归调用不是最后执行的操作时,gcc 可以使用 tco 优化的限制是什么?

附录:我已经编写了return function(); …

c optimization recursion gcc tail-call-optimization

4
推荐指数
1
解决办法
682
查看次数

git merge:如何在BASE文件中出现冲突?

我在的BASE文件中具有以下内容git merge

<<<<<<<<< Temporary merge branch 1
    - _modifiedTimeWeak = 4.25.2019::11:41:6;
    - _lastID = 3;
    - weakCGTime = 4.25.2019::11:42:20;
    - strongCGTime = 1.2.1990::0:0:0;
=========
    - _modifiedTimeWeak = 5.1.2019::8:52:36;
    - _lastID = 3;
    - weakCGTime = 5.1.2019::8:52:36;
    - strongCGTime = 3.20.2019::17:13:20;
>>>>>>>>> Temporary merge branch 2
Run Code Online (Sandbox Code Playgroud)

我现在已经对该文件进行了无基础的合并,因此没有未解决的问题,但是我想了解可能出了什么问题。

我已经检查了由标识的BASE提交git merge-base,并且它不包括所介绍的合并冲突,因此可以排除。这也是这是第一次,尽管在此存储库发生之前已经进行了许多合并。

可能值得注意的是,我正在使用git merge merge-tool

执行合并时,可能导致BASE文件出现合并冲突的原因是什么,可以采取什么步骤来避免将来发生这种情况?

git merge

4
推荐指数
1
解决办法
94
查看次数

从循环内的向量中删除项目

我想从循环内的向量中删除一些索引.
我目前有以下代码:

static void store_faces(Mat image, vector<Rect> faces,  string path, string fileName){

 SkinDetector mySkinDetector;
 int counter = 0;
 for(int i = 0; i < faces.size(); i++){
    Mat temp = image(faces.at(i));

    double ratio= mySkinDetector.getSkin(temp);
    cout << "found face skin ratio.. " << ratio << endl;

    string file_name = path+ fileName + "_"+ NumberToString(counter)+".jpg";
    imwrite(file_name, temp);
    counter+=1;
  }
}
Run Code Online (Sandbox Code Playgroud)

我想删除那些有脸的脸ratio < 0.5.如何从中删除物品vector<Rect> faces

c++ opencv vector

1
推荐指数
1
解决办法
735
查看次数

C代码:在递归调用中将表达式作为参数传递

我正在练习一些C问题遇到一个递归函数用表达式作为参数调用自身的场景.

Pow(double x, unsigned n){ 
  .....
  .....
  return Pow(x*x,n/2);
 }
Run Code Online (Sandbox Code Playgroud)

我的问题是,是否计算表达式(X*X,如在由值调用)时,参数被传递或执行此一惰性求即,不评价使用时为止.

以下是详细问题

查找调用Pow(5.0,12)的乘法次数?

Pow(double x, unsigned n) { 
     if(n==0)   return 1;
     if(n==1)   return x;
     if(n%2==0) return Pow(x*x,n/2);
     else      
     return Pow(x*x,n/2)*x;
}
Run Code Online (Sandbox Code Playgroud)

选项5,6,8,12

c recursion parameter-passing generic-programming call-by-value

0
推荐指数
1
解决办法
588
查看次数

++和&&的运算符优先级

我有以下代码

int a=0,b=5;
int c=a&&++b;
cout<<b;
Run Code Online (Sandbox Code Playgroud)

当我运行此代码段时,输出值为5.

从我的理解,++有更大的运算符优先级,所以不应该++b被评估之前&&导致的价值b6

为什么价值b不会增加?是因为我误解了优先权还是其他一些特征?

c++

-1
推荐指数
1
解决办法
75
查看次数

增量和减量运算符

我对这个程序的输出感到困惑:

#include<stdio.h>
int main()
{
    int i=2;
    while(i + 1?--i:14)
        printf("\n%d", i);

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

上述程序的输出是打印1而不是打印1然后0

何时i--使用而不是--i它将打印1然后0

为什么是这样?

  • 为什么在预先制作它只打印1而不打印0
  • 为什么在postdecrementation中打印1然后0呢?

c operators decrement

-5
推荐指数
1
解决办法
124
查看次数