相关疑难解决方法(0)

在C++ 11和Boost.Container下,vector :: resize(size_type n)的这种行为是否正确?

我有一个C++ 03应用程序,其中std::vector<T>类型作为临时缓冲区使用.因此,它们通常会使用std::vector<T>::resize()以确保它们足够大以在使用前保存所需数据.这个函数的C++ 03原型实际上是:

void resize(size_type n, value_type val = value_type());
Run Code Online (Sandbox Code Playgroud)

因此,实际上在调用时resize(),通过添加适当数量的副本来放大矢量val.但是,通常我只需要知道它vector足够大以容纳我需要的数据; 我不需要用任何值初始化它.复制构造新值只是浪费时间.

C++ 11拯救了(我想):在它的规范中,它分为resize()两个重载:

void resize(size_type n); // value initialization
void resize(size_type n, const value_type &val); // initialization via copy
Run Code Online (Sandbox Code Playgroud)

这非常适合C++的理念:只需支付你想要的东西.正如我所指出的那样,我的应用程序不能使用C++ 11,所以当我遇到Boost.Container库时,我很高兴,它表明在其文档中支持这个功能.具体来说,boost::container::vector<T>实际上有三个重载resize():

void resize(size_type n); // value initialization
void resize(size_type n, default_init_t); // default initialization
void resize(size_type n, const value_type &val); // initialization via copy
Run Code Online (Sandbox Code Playgroud)

为了验证我理解了所有内容,我进行了快速测试以验证C++ 11的行为std::vector<T>boost::container::vector<T> …

c++ boost vector c++11

23
推荐指数
2
解决办法
7457
查看次数

leaq是慢还是还有另一个原因,较小的汇编列表比较长的汇编列表慢?

我不知道任何真正的汇编,但可以读取GCC -S输出来评估给定C代码的实际成本.

这个问题并不是关于分析和基准的问题,而是教育问题.我需要有人来解释为什么[1]片段不比第二片段快.

嗯,过去常常这样想:"是的,像MUL这样的操作非常昂贵,但是如果一个组件比另一个组件大X倍,它应该更慢".

在我遇到这两个之前,这是真的:

unsigned char bytes[4] = {0, 0, 0, 5};

// 1
int32_t val = *((int32_t*)bytes);      
/* produces:
        leaq    -16(%rbp), %rax
        movl    (%rax), %eax
        movl    %eax, -4(%rbp)
        movl    $0, %eax
*/

// 2   
val = bytes[3] |                               
      (bytes[2] << 8) |                        
      (bytes[1] << 16) |
      (bytes[0] << 24);
/* produces: 
        movzbl  -13(%rbp), %eax
        movzbl  %al, %eax
        movzbl  -14(%rbp), %edx
        movzbl  %dl, %edx
        sall    $8, %edx
        orl     %eax, %edx
        movzbl  -15(%rbp), %eax
        movzbl  %al, %eax
        sall    $16, …
Run Code Online (Sandbox Code Playgroud)

performance x86 assembly intel

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

标签 统计

assembly ×1

boost ×1

c++ ×1

c++11 ×1

intel ×1

performance ×1

vector ×1

x86 ×1