草庐IT

std=c++11

全部标签

c++ - std::vector 应该尊重 alignof(value_type) 吗?

如果我定义一个具有特定对齐要求的简单类型,该类型的std::vector难道不应该为每个元素遵守对齐吗?考虑下面的例子typedefstd::arrayalignas(32)avx_point;std::vectorx(10);assert(!(std::ptrdiff_t(&(x[0]))&31)&&//assertthatx[0]is32-bytealigned!(std::ptrdiff_t(&(x[1]))&31));//assertthatx[1]is32-bytealigned我发现clang3.2(带或不带-stdlib=libc++)悄悄地(没有任何警告)违反了对齐要求

c++ - 获取 UTF-8 编码的 std::string 的实际长度?

我的std::string是utf-8编码的,很明显,str.length()返回了错误的结果。我找到了此信息,但不确定如何使用它来执行此操作:Thefollowingbytesequencesareusedtorepresentacharacter.ThesequencetobeuseddependsontheUCScodenumberofthecharacter:0x00000000-0x0000007F:0xxxxxxx0x00000080-0x000007FF:110xxxxx10xxxxxx0x00000800-0x0000FFFF:1110xxxx10xxxxxx10xxx

c++ - std::hardware_destructive_interference_size 的可靠性

C++17引入了常量,这似乎对缓存感知编程很有用:https://en.cppreference.com/w/cpp/thread/hardware_destructive_interference_sizeinlineconstexprstd::size_thardware_destructive_interference_size,inlineconstexprstd::size_thardware_constructive_interference_size尽管我想知道它们的可靠性如何?是否保证以后不会有相同CPU架构内具有其他缓存线大小的新CPU型号?即x64缓存行大小为64字

c++ - 如何让 boost::iostream 以类似于 std::ios::binary 的模式运行?

我有以下关于boost::iostreams的问题。如果有人熟悉编写过滤器,我将非常感谢您的建议/帮助。我正在编写一对多字符过滤器,它们与boost::iostream::filtering_stream一起用作数据压缩器和解压缩器。我从编写压缩器开始,从lz系列中学习了一些算法,现在正在研究解压缩器。简而言之,我的压缩器将数据拆分为数据包,这些数据包分别编码,然后刷新到我的文件中。当我必须从我的文件中恢复数据时(在编程术语中,接收一个read(byte_count)请求),我必须读取一个完整打包block,缓冲它,解压它,然后才给出请求的字节数。我已经实现了这个逻辑,但现在我正在努力

c++ - "constify" `std::pair` 的字段是否可以不被黑客攻击?

在C++中,编译如下代码:std::pairx;static_cast*>(&x);报错:error:invalidstatic_castfromtype‘std::pair*’totype‘std::pair*’我或多或少理解为什么会这样,因为在模板参数列表中对类型进行cv限定原则上可以给出“不兼容”的结果。即使在这种情况下它不知道,编译器也无法知道。无论如何,是否有一种非hackish的方式来执行此转换?我对使用reinterpret_cast持谨慎态度对于我之前遇到过的类型双关问题。另外,我不能使用临时变量,因为这是对性能至关重要的代码。编辑:这就是我正在做的。我正在实现与std

c++ - 在 DirectX11 游戏上叠加

我正在开展一个项目,以在任何DirectX11游戏上显示叠加层。现在overaly可以在一些DX11游戏中显示,但在其他一些游戏中不能显示。我使用MSDetour连接了DX11APIIDXGISwapChain::Present()。在函数Present()中,我设置了每个管道,调用DrawIndex和ResourceCopy将我的叠加纹理更新到GPU的内存,然后调用原始Present将后台缓冲区带到前台缓冲区。它在某些游戏(如Unigene和DIRT2)中运行良好,但在其他一些游戏(如LostPlanet2和DragonAge2)中不起作用。通过Hook所有DX11函数进行一些日志记

c++ - boost::fusion::for_each 中的函数对象不同于 std::for_each

在升级到更新的编译器并解决编译器错误时,我意识到boost::fusion::for_each要求传入的函数对象具有运算符const。示例来自Boost:structincrement{templatevoidoperator()(T&t)const{++t;}};...vectorvec(1,2);for_each(vec,increment());这当然没有改变。我没有意识到它与std::for_each不同,它不要求运算符是const。structincrement{templatevoidoperator()(T&t)//noconsthere!!!{++t;}};std::v

map - C++ wcout std::map 值

我有一个名为“提示”的std::map,声明如下:std::map,std::allocator>>prompts;它存储int'key'和wstring'value'对。如果我这样做:wcoutget_state()];编译器(vc10)提示errorC2679:binary''(orthereisnoacceptableconversion)我必须做什么才能使map返回的wstring值用wcout打印?某种类型转换?或者……? 最佳答案 在第一行中,您缺少一个std::std::mapstd::wstring,std::les

C++11:计算可变函数参数类型

假设您要编写一个函数,该函数将不透明句柄传递给未知类型的函数(例如,包含具有商定名称的函数的结构的名称),并将参数转发给该函数。在非可变参数的情况下,为简单起见考虑单参数函数,有两种方法可以做到这一点:您可以让转发函数接受任意类型的参数,并尝试用它调用转发函数,然后如果结果不兼容,编译器会在模板扩展期间提示;或者您可以使用decltype和其他各种机制来确定forwardee函数期望的参数类型,并明确要求该类型的参数。我不知道这些是否有公认的术语,所以我将它们称为“通过”和“预先”。passthrough方法可以直接泛化为具有任意数量参数的函数,但upfront方法不能。#includ

c++ - std::function:参数的严格编译时验证

我想实现一个类,它包含两个带有预定义函数签名的回调。该类具有模板化构造函数,它使用std::bind来创建std::function成员。我预计编译器(g++4.6)会提示如果将签名错误的函数传递给ctor。但是,编译器接受以下内容:callbackc1(i,&test::func_a,&test::func_a);我能理解它为什么这样做。我试图为static_assert构造一个适当的条件,但没有成功。如何通过编译时错误来避免这种情况?#includeusingnamespacestd::placeholders;classcallback{public:typedefstd::fu