小编Joe*_*ert的帖子

std :: vector <uint8_t>手动复制,而不是在启用C++ 11/14时调用memcpy

使用gcc 4.9,使用Linaro工具链对ARM进行交叉编译,我vector.assign()在添加时发现了更改的编译结果-std=c++14,其方式会产生严重的性能问题.

我已经尝试了几种不同的方式来执行此分配+复制,但只要我习惯这样做,所有这些方法都会std::vector遇到此性能问题.

我可以通过这个玩具示例重现问题:

VectorTest.h

#include <stdint.h>
#include <stddef.h>
#include <vector>

struct VectorWrapper_t
{
    VectorWrapper_t(uint8_t const* pData, size_t length);
    std::vector<uint8_t> data;
};
Run Code Online (Sandbox Code Playgroud)

VectorTest.cpp

#include "VectorTest.h"

VectorWrapper_t::VectorWrapper_t(uint8_t const* pData, size_t length)
{
    data.assign(pData, pData + length);
}
Run Code Online (Sandbox Code Playgroud)

gcc标志:

-std=c++14 \
-mthumb -march=armv7-a -mtune=cortex-a9 \
-mlittle-endian -mfloat-abi=hard -mfpu=neon -Wa,-mimplicit-it=thumb \
-O2 -g
Run Code Online (Sandbox Code Playgroud)

查看程序集,我可以看到原因:原始版本(C++ 03,我假设?)调用memmove,而C++ 14版本则添加了一个额外的循环,它看起来像是手动复制数据.看看.locgcc添加的标签-fverbose-asm,这个循环中的指令来自stl_construct.hstl_uninitialized.h.

更改为gcc 5.2.1(使用C++ 14),它的编译几乎与C++ 03示例完全相同,除了memcpy代替memmove.

我可以通过使用std::unique_ptr<uint8_t[]>而不是在 …

c++ gcc stdvector c++11 c++14

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

为什么static_cast是一个分布式表达的表达式?

我需要取2个无符号8位值并减去它们,然后将该值加到32位累加器中.8位减法可能会下溢,这没关系(unsigned int underflow是定义的行为,因此没有问题).

我希望这static_cast<uint32_t>(foo - bar)应该做我想要的(在哪里foobar都是uint8_t).但看起来这会先抛出它们然后执行32位减法,而我需要它作为8位变量下溢.我知道我可以只修改256,但我想弄清楚它为什么会这样工作.

示例:https://ideone.com/TwOmTO

uint8_t foo = 5;
uint8_t bar = 250;

uint8_t diff8bit = foo - bar;
uint32_t diff1 = static_cast<uint32_t>(diff8bit);

uint32_t diff2 = static_cast<uint32_t>(foo) - static_cast<uint32_t>(bar);

uint32_t diff3 = static_cast<uint32_t>(foo - bar);

printf("diff1 = %u\n", diff1);
printf("diff2 = %u\n", diff2);
printf("diff3 = %u\n", diff3);
Run Code Online (Sandbox Code Playgroud)

输出:

diff1 = 11
diff2 = 4294967051
diff3 = 4294967051
Run Code Online (Sandbox Code Playgroud)

我怀疑diff3会有相同的行为diff1,但它实际上是相同的diff2 …

c++ casting static-cast

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

标签 统计

c++ ×2

c++11 ×1

c++14 ×1

casting ×1

gcc ×1

static-cast ×1

stdvector ×1