小编Wal*_*ter的帖子

有哪些符合 C++ 标准的自定义分配器可用?

我想以从 派生的类的形式使用一些符合 C++ 标准的内存管理std::allocator,但能够分配内存块并以较小的部分释放它们。我只找到了 boost::pool,但这在上述意义上不符合标准。有什么更有用的东西还是我必须自己编写代码?

(请注意,std::allocator对于分配许多小对象,即使用 时,通常是无用的std::list。)

编辑以澄清。

比如说,我想使用std::list许多小对象中的一个,然后std::allocator使用分配每个对象的实现::new会导致运行时的巨大开销(而且我认为还有内存)。分配大块对象并将它们一一分发会更有效。为此,我需要一个std兼容的分配器(不需要从 派生std::allocator,但必须实现相同的概念),它可以与任何库容器一起使用std并提供所需的内存管理,理想情况下允许我告诉它有多少个对象我可能会单独分配。

c++ user-interface memory-management allocation c++11

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

C++ std :: vector of array的编译器错误

以下代码不能用gcc 4.7.0编译(使用std = c ++ 11 -O3)

int n;
std::vector< int[4] > A;
A.resize(n);
Run Code Online (Sandbox Code Playgroud)

错误消息是长度,但最终

functional cast to array type ‘_ValueType {aka int[4]}‘
Run Code Online (Sandbox Code Playgroud)

它是否正确?还是应该编译?更重要的是,如何避免这个问题?(没有定义一个新的结构来保存int[4])

编辑:

如何用C++ 98解决问题?

c++ arrays stdvector

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

如何找出openMP并行区域内?

在我的代码中,我想避免在任何openMP并行区域内抛出异常(因为如果未在同一区域内捕获,则会导致未处理的异常).为此,我尝试使用openmp运行时库函数

omp_in_parallel();
Run Code Online (Sandbox Code Playgroud)

决定是抛出异常还是写出错误消息并终止.但是,在gcc 4.7.0下,如果只有一个并行区域的线程,这将不起作用:

#include <iostream>
#include <omp.h>

void do_something()
{
  if(!omp_in_parallel())           // omp_in_parallel() returns false!
    throw 3;                       // so should be able to safely throw
}

int main()
{
  omp_set_num_threads(1);
  try {
#   pragma omp parallel
    do_something();
  } catch(int e) {
    std::cerr<<"error: '"<<e<<"'\n";  // never gets here
  }
}
Run Code Online (Sandbox Code Playgroud)

不会导致错误:'3'但是在抛出'int'Abort实例后调用终止.

这是正确的行为omp_in_parallel()吗?(openMP标准显得足够模糊)或gcc中的错误?如何修复上面的代码,do_something()以便仅在不在并行区域时抛出?

c c++ openmp

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

链接器错误"重定位R_X86_64_PC32对未定义的符号"尽管使用-fPIC进行编译

我正在使用命令行编译一个c ++程序

g++ -c prog.cc -std=c++11 -march=native -fPIC -fopenmp
Run Code Online (Sandbox Code Playgroud)

然后尝试通过创建共享对象

g++ prog.o -shared -fopenmp -o lib/libprog.so
Run Code Online (Sandbox Code Playgroud)

这一直都有效.但今天我得到:

/usr/bin/ld: prog.o: relocation R_X86_64_PC32 against undefined symbol 
  `_ZTVN12_GLOBAL__N_111handle_baseE' can not be used when making a shared
  object; recompile with -fPIC
/usr/bin/ld: final link failed: Bad value
collect2: error: ld returned 1 exit status
Run Code Online (Sandbox Code Playgroud)

符号_ZTVN12_GLOBAL__N_111handle_baseEde-mangles to vtable for (anonymous namespace)::handle_base (handle_base是在prog.cc中的匿名命名空间中定义的多态类,是的,我打电话dynamic_cast<handle_base>().)

我正在使用gcc版本4.7.0(GCC)和GNU ld(GNU Binutils; openSUSE 11.1)2.19.任何人都可以提供帮助(建议解决方案[除了没有共享对象或其他dynamic cast])?

c++ gcc linker-errors ld fpic

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

在计算一段代码时,我是否需要易失性?

我想自动调整我的代码,因此必须测量某些代码段所需的时间

auto t0 = std::chrono::high_resolution_clock::now();
section_of_code_to_be_timed(arguments);
auto dt = std::chrono::duration_cast<std::chrono::nanoseconds>
         (std::chrono::high_resolution_clock::now()-t0).counts();
// ... using dt to tweak auto-tuning parameters
Run Code Online (Sandbox Code Playgroud)

我担心的是,编译器可能会重新安排的呼吁std::chrono::high_resolution_clock::now()section_of_code_to_be_timed(),因此无效我定时测量.这是一个有效的担心吗?如果是这样,我可以通过声明t0 volatile或其他方式(如何)来阻止它吗?

(我注意到我可以使用RAII成语,类似于std::lock_guard,似乎没有用volatile...)

c++ timing volatile

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

可变参数模板参数:我可以根据类型选择参考值和值吗?

编辑不是对静态类成员未定义引用的重复.那个问题探讨了问题的原因(我在下面解释).在这里,我正在寻找与那些问题的答案中提出的解决方案不同的解决方案(这意味着更改constexpr要使用的变量的声明/定义- 主要是通过在编译单元中添加定义).

我已经创建了一个小的可变参数模板函数make_string()来生成std::string任意数量的io-able参数,如下所示.

using std::ostringstream; // just for this example

inline ostringstream&write(ostringstream&ostr, const char*x)
{ if(x) ostr<<x;  return ostr; }

template<class T>
inline ostringstream&write(ostringstream&ostr, T const&x)
{ ostr<<x;  return ostr; }

inline ostringstream&write(ostringstream&ostr) noexcept
{ return ostr; }

template<class T, class... R>
inline ostringstream&write(ostringstream&ostr, T const&x, R&&... r)
{ return write(write(ostr,x), std::forward<R>(r)...); }

inline std::string make_string(const char*text)
{ return {text?text:""}; }

inline std::string …
Run Code Online (Sandbox Code Playgroud)

c++ templates argument-passing variadic-templates c++11

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

穷人是_mm_cvttpd_epi64的替代品

AXV512DQ,我们发现_mm_cvttpd_epi64,例如在文件中avx512vldqintrin.h

static __inline__ __m128i __DEFAULT_FN_ATTRS
_mm_cvttpd_epi64 (__m128d __A) {
  return (__m128i) __builtin_ia32_cvttpd2qq128_mask ((__v2df) __A,
               (__v2di) _mm_setzero_si128(),
               (__mmask8) -1);
}
Run Code Online (Sandbox Code Playgroud)

它将两个打包的64位浮点数(__m128d)转换为两个打包的64位整数(__m128i).还有_mm256_cvttpd_epi64用于将四个打包的64位浮点数(__m256d)转换为四个打包的64位整数(__m256i).

但是,很多机器都不支持AXV512DQ.所以我想知道一个穷人的最佳选择是什么.

我应该说我已经满意的解决方案仅适用于64位浮点数,可以无损转换为32位浮点数.

c c++ avx avx512

5
推荐指数
0
解决办法
228
查看次数

emplace_back和继承

我想知道你是否可以使用emplace_back将项目存储到一个向量中,这是一种从向量所期望的类派生的类型.

例如:

struct fruit
{
    std::string name;
    std::string color;
};

struct apple : fruit
{
    apple() : fruit("Apple", "Red") { }
};
Run Code Online (Sandbox Code Playgroud)

别的地方:

std::vector<fruit> fruits;
Run Code Online (Sandbox Code Playgroud)

我想在向量中存储apple类型的对象.这可能吗?

c++ inheritance vector c++11

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

如何在C++中使用给定的位模式(如int32_t)获取浮点数?

我需要一种快速的方法来获得float具有给定位模式(提供为int32_t).当然,编译器应该优化整个构造.简单的转换会进行转换,reinterpret_cast<>不允许...

c++ type-conversion c++11

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

在c ++中限制对纯虚函数的派生类的访问

class A
{    
public:
    void virtual magic() = 0;
    void bar()
    {
        magic();    // this should be legal
    }        
};

class B: public A
{    
public:
    void magic()
    {
        cout<<"implement magic here"<<endl;
    }
};

class C: public B
{
     void foo()
     {
         magic();     // this should not be allowed, i.e. create compile-time error
     }
};
Run Code Online (Sandbox Code Playgroud)

因此,该纯虚基类AB应访问magic(),但不排除任何派生类CB.这可以使用访问说明符和/或朋友声明或以任何其他方式实现吗?

c++ virtual

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