我想以从 派生的类的形式使用一些符合 C++ 标准的内存管理std::allocator,但能够分配内存块并以较小的部分释放它们。我只找到了 boost::pool,但这在上述意义上不符合标准。有什么更有用的东西还是我必须自己编写代码?
(请注意,std::allocator对于分配许多小对象,即使用 时,通常是无用的std::list。)
编辑以澄清。
比如说,我想使用std::list许多小对象中的一个,然后std::allocator使用分配每个对象的实现::new会导致运行时的巨大开销(而且我认为还有内存)。分配大块对象并将它们一一分发会更有效。为此,我需要一个std兼容的分配器(不需要从 派生std::allocator,但必须实现相同的概念),它可以与任何库容器一起使用std并提供所需的内存管理,理想情况下允许我告诉它有多少个对象我可能会单独分配。
以下代码不能用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解决问题?
在我的代码中,我想避免在任何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 ++程序
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])?
我想自动调整我的代码,因此必须测量某些代码段所需的时间
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...)
编辑这不是对静态类成员的未定义引用的重复.那个问题探讨了问题的原因(我在下面解释).在这里,我正在寻找与那些问题的答案中提出的解决方案不同的解决方案(这意味着更改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) 在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位浮点数.
我想知道你是否可以使用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类型的对象.这可能吗?
我需要一种快速的方法来获得float具有给定位模式(提供为int32_t).当然,编译器应该优化整个构造.简单的转换会进行转换,reinterpret_cast<>不允许...
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)
因此,该纯虚基类A的B应访问magic(),但不排除任何派生类C的B.这可以使用访问说明符和/或朋友声明或以任何其他方式实现吗?