小编Chr*_*rys的帖子

有关交换性能的问题

我有三个关于交换的问题,很可能对你很基本.

(1)至于两个同类型的STL容器ab,下面这两个操作会工作

swap(a,b);
a.swap(b);
Run Code Online (Sandbox Code Playgroud)

我理解第二个是专门用于容器的(例如,只涉及许多迭代器交换),而第一个是一个全局算法,用于处理通用数据类型并执行内部复制构造.

我的问题是如果我写第一个,编译器是否会使用第二个,或者我是否必须小心检查是否存在适当的特化?

(2)会swap(a,b)导致相同的表现swap(b,a)吗?如果涉及复制构造并且对象的大小差异很大,我怀疑它可能很重要吗?

(3)在重载操作符==存在且相对较快的情况下,a == b在交换之前进行检查是有意义的,以避免不必要的操作.是std::swap先应用此检查,还是执行操作?

谢谢你的时间!

c++

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

是否值得声明作为参数传递的数组的(常量)大小?

    const int N = 100;

    void function1(int array[]){
        // ...
    }
    void function2(int array[N]){
        // ...
    }

    int main(int argc, char *argv[]){
        int a[N] = {1, 2, 3, ... , 100};
        function1(a);
        function2(a);
        return 0;
    }
Run Code Online (Sandbox Code Playgroud)

我想知道是否function2有可能比function1某些类型的C++编译器优化更快(例如,编译器sizeof(array)在编译时计算出来).

对于C,之前已经讨论过相同的主题:我应该声明作为函数参数传递的数组的预期大小吗?.

谢谢!

c++ optimization

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

C++使用`const int`作为循环变量?

我想编写有条件编译的代码,并根据以下两种情况:

CASE_A:

    for(int i = 1; i <= 10; ++i){
        // do something...
    }
Run Code Online (Sandbox Code Playgroud)

CASE_B:(==!CASE_A)

    {
        const int i = 0;
        // do something...
    }
Run Code Online (Sandbox Code Playgroud)

也就是说,在A的情况下,我希望在变量上有一个正常的循环,i但是在B的情况下,我想将局部范围变量限制i为仅特殊情况(在此指定为i = 0).显然,我可以写一些东西:

    for(int i = (CASE_A ? 1 : 0); i <= (CASE_A ? 10 : 0); ++i){
         // do something
    }
Run Code Online (Sandbox Code Playgroud)

但是,我不喜欢这种设计,因为它不允许我利用const特殊情况B中的声明.这样的声明可能会允许大量的优化,因为这个循环的主体从潜在的编译时间中获益很大i以其恒定值替换.

期待社区提供有关如何有效实现这一目标的任何提示.

谢谢!

EDITS:

可以在编译时评估CASE_A与CASE_B.

i 不作为参考传递

i没有在体内重新评估(否则const没有意义),但我不确定编译器是否会通过努力来证明

c++ conditional-compilation

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

指向静态数组,但在不使用*的情况下取消引用

我有一系列NX对象(例如,下面示例中的维度[NX] [N1] [N2]的静态bool数组).

我想循环这些对象.在每次迭代中,一个名为"A"的对象将作为系列中相应元素"B [x]"的代理.但是,循环中的代码是遗留代码,因此我们无法真正改变我们引用"A"本身的方式

    const int NX = ...;
    const int N1 = ...;
    const int N2 = ...;
    bool B[NX][N1][N2];

    Code_needed: declare A here (maybe first defining a class template?)

    int main(){

      for(int x = 0; x < NX; ++x){
        Code_needed: make A refer to B[x] here (maybe A = &B[x])
        // In the following, "A[i][j]" should refer to B[x][i][j]...
        A[3][5] = true; // This is legacy code, so we cannot change it
                        // (e.g., cannot add a …
Run Code Online (Sandbox Code Playgroud)

c++

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