草庐IT

std-function

全部标签

c++ - std::list、std::vector 方法和 malloc()

在中断处理程序下使用STL:list和STL::vector类型我想避免调用malloc()。问题:防止在STL列表和vector中调用malloc()的最佳方法是什么?创建具有预定义大小的结构然后避免push/pop/erase调用就足够了吗?提前致谢 最佳答案 std::list和std::vector等STL容器具有接受Allocator类型的构造函数。通过提供您自己的分配器而不是使用默认分配器,您可以控制容器分配内存的方式。这个选项很少使用,但是在实时环境中使用你自己的分配器是一个很好的例子,说明了这个特性在哪里有用(并证明

c++ - std::vector 优化

假设从std::vector读取大量值的循环是我程序中的瓶颈,建议我更改voidf(std::vectorv){...while(...){...intx=v[i]+v[j]...}}到voidf(std::vectorv){int*p_v=&v[0];...while(...){...intx=p_v[i]+p_v[j]...}}通过绕过[]运算符,这实际上会提高性能吗? 最佳答案 更有可能(从表面上看)每次调用此函数时复制整个vector是瓶颈。为什么不是下面的呢?voidf(conststd::vector&v)在任何情况下,

c++ - 未解析的外部符号 “std::basic_string”

我正在尝试通过VisualC++编译器使用Maven编译一个项目,但我不断收到关于std::basic_string类的链接错误。我确保将头文件包含到相应的c++文件中。我是漏掉了什么还是犯了一个愚蠢的错误???请让我知道哪里出错了。[ERROR]Parsor.obj:errorLNK2001:unresolvedexternalsymbol"__declspec(dllimport)public:int__thiscallstd::basic_string,classstd::allocator>::compare(classstd::basic_string,classstd::a

c++ - 如何查询范围内的任何位是否在 C++ std::bitset 中设置?

我正在寻找一个C++bitset实现,它可以回答是否在一个范围内设置了一个位。std::bitset,vector,和boost::dynamic_bitset都可以访问我可以循环的各个位,但这不是查询位范围以询问是否设置了任何位的最有效方法-我什至不需要知道哪个。bitsetb;if(b.any(33,199)){//...}有图书馆提供这个吗?我想针对其他实现(包括我可能必须编写的实现)运行一些基准测试,但我找不到任何似乎实现此功能的基准。 最佳答案 不幸的是,在C++11bitset中,无法通过仅指定范围的边界来将位范围设置为

c++ - 推导成员函数和变量的模板参数

对于令人困惑的标题,我深表歉意,我找不到更清晰的方式来表达我的问题。我正在尝试使用std::functions来实现回调。这个想法是将“Action”映射到函数,并提供一个简单的界面来跟踪在某个Action发生时调用哪些函数。这是我的类(class)的简化版本:templateclassA{public:voidRegister(IDid,std::functionfunct){m_listeners.emplace(id,funct);}A(){}~A(){}private:std::unordered_multimap>m_listeners;};我真正想要的是A只有1个模板模板因

c++ - 如何可移植地将 std::system_error 异常与 std::errc 值进行比较?

据我所知,以可移植的方式检查system_error条件的最佳实践之一是将它们的code()值与std::errc枚举。但是,当我尝试运行以下代码时,这似乎不起作用。#include#include#includeintmain(){try{throwstd::system_error(ENOENT,std::system_category());}catch(std::system_errorconst&e){assert(e.code()==std::errc::no_such_file_or_directory);//我是不是误解了这些诊断错误的工作原理,还是我做错了什么?如何将

C++ 多态性 : Is there any way to find the address of an object's member function?

如果我有一个纯虚拟基类及其多个派生...classBase{public:virtualvoidmethod1()=0;}classDerived1:publicBase{public:voidmethod1()override{...}}classDerived2:publicBase{public:voidmethod1()override{...}}有什么方法可以让持有未知派生类型对象的Base*的代码确定它持有的对象的method1()函数的地址Base*指针指向?我想做的是这样的:voidsomeOtherFunction(Base*pb){printf("IfIcallpb

c++ - Boost::bind 一个带有 boost::function 参数的方法

我想为async_write提供一个额外的boost::function。我希望首先调用连接自己的HandleWrite函数,然后调用提供的boost::function。绑定(bind)asioasync_write的Connection成员方法voidConnection::HandleWrite(constboost::system::error_code&e,boost::functionhandler){//Coderemovedforclarityif(!handler.empty())handler(e);};尝试将HandleWrite绑定(bind)到asioasyn

c++ - 从 char* 初始化 std::string 而不复制

我遇到这样一种情况,我需要处理大量(许多GB)数据:通过附加许多较小的(Cchar*)字符串构建一个大字符串修剪字符串将字符串转换为C++conststd::string进行处理(只读)重复每次迭代中的数据都是独立的。我的问题是,我想尽量减少(如果可能的话消除)堆分配的内存使用量,因为目前这是我最大的性能问题。有没有一种方法可以将C字符串(char*)转换为STLC++字符串(std::string)而无需std::string在内部分配/复制数据?或者,我可以使用stringstreams或类似的东西来重新使用大缓冲区吗?编辑:感谢您的回答,为了清楚起见,我认为修改后的问题是:如何有

c++ - std::runtime_error::what() 在使用嵌套异常时导致访问冲突

我不是在寻找解决这个问题的方法,只是想了解它的原因。一位同事向我展示了一些代码,这些代码在由VisualStudio2008编译以在WindowsMobile6ARMV4I下运行时会导致访问冲突。同样的代码在x86Windows下运行良好,他声称它在GCC编译的Linux下运行(我尚未验证)。我将问题归结为以下代码:intmain(intargc,char*argv[]){try{throwstd::runtime_error("a");}catch(std::runtime_error&e1){try{try{throwstd::runtime_error("b");}catch(s