小编Pau*_*l92的帖子

识别和跟踪无用的复制

C++ 中对性能的很多关注是减少无用的复制。

该语言本身带有许多在这方面有所帮助的不错的功能,包括移动语义、完美转发等。

有时很难看到无用的副本。

此外,其中一些副本可以通过在错误的时间强制转换或分配给错误的类型来制作,这最终会很昂贵,尤其是在使用惰性求值库时。

除了测量时间性能并仔细查看似乎慢得令人怀疑的代码之外,还有没有更好的方法来避免这些问题?也许某种形式的内存基准测试程序?

c++

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

默认情况下,类应该是最终的吗?

引用 Effective C++ (Scott Meyers),第三版,第 7 项:

在多态基类中将析构函数声明为 virtual。

这意味着要继承的类至少应该具有虚拟析构函数。

在编写一些应用程序/库时,有些类(我会说不少)并不是为了继承而设计的。我们通常依赖于一些约定,其中不应该继承不是他自己的类或不检查它是否安全。

现在,编码标准可能需要编写和设计类,以便继承始终是安全的。我觉得这可能太多了。C++11 添加了final确保类不被继承的关键字。您是否建议将所有不是为继承而设计的类标记为final默认值?

这将使编译器强制执行我们多年来按照惯例所做的事情。但是该约定可能被认为足够好理解且易于遵循(特别是因为通常避免继承,而首选组合),因此在编写代码时可能只是另一件需要注意的事情。

c++

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

Git 补丁子模块

我有一个带有一些依赖项的项目,这些依赖项被作为 git 子模块拉取。我为其中一个应用了一个小补丁(大约 6 行更改,没什么重要的)。

有没有办法在拉取子模块时自动应用此补丁?

git

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

后续函数调用的相同内存地址

这个问题与这个问题密切相关:为什么本地变量的地址对于不同的执行是相同的?.我理解这个问题的答案,但是如果我在有趣的调用之间在堆栈上添加了一些东西,那么地址仍然是相同的:

int fun(int x);

int main()
{
    fun(10);
    int p = 0x12345678;
    fun(11);   
    return 0;
}

int fun(int x)
{
    int loc;//local variable
    cout<<&loc;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我期望第二次调用fun报告的变量地址大于前一个4字节,因为我在堆栈上引入了变量p.

我的直觉说这是一种编译器优化,更具体地说,p的内存在实际定义之前被"分配",这进一步得出结论:内存被分配(可能我应该说保留,未分配)用于本地函数开头的变量.

c c++ stack

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

Structured bindings to get consecutive elements of a sub-vector without copying

I have a std::vector<T> vec where consecutive blocks of 3 elements are of interest. For ease of processing, I'd like to extract such elements. Currently, the code looks like:

const T& a = vec[i];
const T& b = vec[i + 1];
const T& c = vec[i + 2];
Run Code Online (Sandbox Code Playgroud)

I'd like to use a structured binding to compress the extraction of a, b, c to a single line.

A simple option would be something along the lines of:

std::tuple<T, …
Run Code Online (Sandbox Code Playgroud)

c++ structured-bindings

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

Assignment of a parenthesized expression

Consider the following snippet:

int a, b, c;
a = (b = 3, c = 4, 5, 6);
Run Code Online (Sandbox Code Playgroud)

It turns out that, after those lines are executed, b has the value 3, c has the value 4. Nothing unexpected so far. But a has value 6. Why is that?

Also, does this have an useful use?

c expression

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

自定义堆中的分段错误

它甚至不执行推送操作。它不调用推送函数,只是构造函数调用和分段错误。为什么会这样?

class Heap {
    vector<int> v;

     void Heapify(int x) {
        int mi = x;
        int l = 2 * x;
        int r = 2 * x + 1;

        if (v[mi] > v[l] && l < v.size()) {
            mi = l;


        }
        if (v[mi] > v[r] && r < v.size()) {
            mi = r;
        }

        if (mi != x) {
            swap(v[mi], v[x]);
            Heapify(mi);
        }
                       }
public:
    Heap() {

        v[0] = -1;
    }
    void push(int x) {

        v.push_back(x);
        int i = v.size()-1; …
Run Code Online (Sandbox Code Playgroud)

c++ heap priority-queue c++11

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

字符串文字的修改是否保证在C中有效?

请考虑以下代码:

int main() {
    char *p = "abcd";
    p[0] = 'x';
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

是否可以通过标准保证在任何环境中工作?

我担心一些编译器决定将字符串存储的内存标记为只读,并尝试修改它会在运行时生成分段错误.但是,在我测试过的所有环境中,它都有效.

c

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

标签 统计

c++ ×5

c ×3

c++11 ×1

expression ×1

git ×1

heap ×1

priority-queue ×1

stack ×1

structured-bindings ×1