小编ben*_*aug的帖子

std :: vector是否使用push_back复制对象?

经过对valgrind的大量调查后,我得出结论,std :: vector制作了你想要push_back的对象的副本.

这是真的吗?没有副本,向量不能保留对象的引用或指针?

谢谢

c++ stl stdvector

157
推荐指数
4
解决办法
10万
查看次数

策略继承和不可访问的受保护成员

似乎来自模板策略类的受保护成员是不可访问的,即使类层次结构似乎是正确的.

例如,使用以下代码段:

#include <iostream>
using namespace std;

template <class T>
class A {
  protected:
    T value;
    T getValue() { return value; }
  public:
    A(T value) { this->value = value; }
};

template <class T, template <class U> class A>
class B : protected A<T> {
  public:
    B() : A<T>(0) { /* Fake value */ }
    void print(A<T>& input) {
      cout << input.getValue() << endl;
    }
};

int main(int argc, char *argv[]) {
  B<int, A> b;
  A<int> a(42);
  b.print(a);
}
Run Code Online (Sandbox Code Playgroud)

编译器(OS …

c++ policy inheritance visibility protected

6
推荐指数
2
解决办法
2584
查看次数

英特尔C编译器使用带对齐内存的未对齐SIMD移动

我使用的是Haswell Core i7-4790K.

当我编译以下玩具示例时icc -O3 -std=c99 -march=core-avx2 -g:

#include <stdio.h>
#include <stdint.h>
#include <immintrin.h>

typedef struct {
  __m256i a;
  __m256i b;
  __m256i c;
} mystruct_t;

#define SIZE     1000
#define TEST_VAL 42

int _do(mystruct_t* array) {
  int value = 0;

  for (size_t i = 0; i < SIZE; ++i) {
    array[i].a = _mm256_set1_epi8(TEST_VAL + i*3    );
    array[i].b = _mm256_set1_epi8(TEST_VAL + i*3 + 1);
    array[i].c = _mm256_set1_epi8(TEST_VAL + i*3 + 2);

    value += _mm_popcnt_u32(_mm256_movemask_epi8(array[i].a)) +
             _mm_popcnt_u32(_mm256_movemask_epi8(array[i].b)) +
             _mm_popcnt_u32(_mm256_movemask_epi8(array[i].c));
  }

  return …
Run Code Online (Sandbox Code Playgroud)

sse intel memory-alignment intrinsics avx

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

ASM x86相对JMP

我正在使用asm函数在C代码中执行一些ASM代码.

我的环境是DVL与gcc版本3.

您需要将JMP设置为相对地址,如%eip + 0x1f.

我怎样才能做到这一点 ?

谢谢

x86 assembly gcc

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