小编Ada*_*erg的帖子

什么是C++中高性能顺序文件I/O的最快方法?

假设以下内容...
输出:
文件打开...
数据"流式传输"到磁盘.内存中的数据位于一个大的连续缓冲区中.它直接从该缓冲区以原始格式写入磁盘.缓冲区的大小是可配置的,但在流的持续时间内是固定的.缓冲区一个接一个地写入文件.没有进行任何搜寻行动.
...文件已关闭.

输入:
从头到尾从磁盘读取一个大文件(按上面顺序写入).


是否有通用的指南来实现C++中最快的顺序文件I/O?

一些可能的考虑:

  • 选择最佳缓冲区大小的指南
  • 像boost :: asio这样的可移植库是否会过于抽象而无法暴露特定平台的复杂性,或者它们可以被认为是最优的?
  • 异步I/O总是优于同步吗?如果应用程序不受CPU限制怎么办?

我意识到这将有特定于平台的考虑因素.我欢迎一般准则以及特定平台的准则.
(我对Win x64最直接的兴趣,但我也对Solaris和Linux上的评论感兴趣)

c++ performance file-io

49
推荐指数
3
解决办法
3万
查看次数

C++数据成员对齐和数组打包

在代码审查期间,我遇到了一些定义简单结构的代码,如下所示:

class foo {
   unsigned char a;
   unsigned char b;
   unsigned char c;
}
Run Code Online (Sandbox Code Playgroud)

在其他地方,定义了这些对象的数组:

foo listOfFoos[SOME_NUM];
Run Code Online (Sandbox Code Playgroud)

之后,将结构原始复制到缓冲区中:

memcpy(pBuff,listOfFoos,3*SOME_NUM);
Run Code Online (Sandbox Code Playgroud)

此代码依赖于以下假设:a.)foo的大小为3,并且不应用填充,并且b.)这些对象的数组被打包,它们之间没有填充.

我已经在两个平台(RedHat 64b,Solaris 9)上使用GNU进行了尝试,并且它在两者上都有效.

以上假设是否有效?如果没有,在什么条件下(例如OS /编译器的变化)可能会失败?

c++ packing bit-packing data-structures

17
推荐指数
4
解决办法
8610
查看次数

在MATLAB极坐标图上修复径向轴

我在MATLAB中使用极坐标图(POLAR(THETA,RHO)).

是否有一种简单的方法来确定径向轴的范围,比如1.5?

我正在寻找类似于笛卡尔坐标轴的xlim,ylim命令的东西.尚未在文档中找到任何内容.

matlab plot histogram polar-coordinates

15
推荐指数
3
解决办法
4万
查看次数

有没有办法在Windows上的basic_iostream上获取非锁定流插入/提取?

我是一名C++开发人员,直到最近才开始在Solaris和Linux上编程,当时我不得不创建一个针对Windows的应用程序.

我一直在使用基于TCP套接字支持的C++ I/O流的通信设计.该设计基于从流中连续读取的单个线程(大多数时间在套接字中阻塞等待数据),而其他线程通过相同的流发送(由互斥锁同步).

当移动到Windows时,我选择使用boost :: asio :: ip :: tcp :: iostream来实现套接字流.我很沮丧地发现上面的多线程设计导致了Windows上的死锁.似乎operator<<(std::basic_ostream<...>,std::basic_string<...>)声明了一个'Sentry'来锁定输入和输出操作的整个流.由于我的读线程始终在流上等待,因此在创建此Sentry时,从其他线程发送操作死锁.

以下是operator <<和Sentry构造期间调用堆栈的相关部分:

    ...
    ntdll.dll!7c901046()    
    CAF.exe!_Mtxlock(_RTL_CRITICAL_SECTION * _Mtx=0x00397ad0)  Line 45  C
    CAF.exe!std::_Mutex::_Lock()  Line 24 + 0xb bytes   C++
    CAF.exe!std::basic_streambuf<char,std::char_traits<char> >::_Lock()  Line 174   C++
    CAF.exe!std::basic_ostream<char,std::char_traits<char> >::_Sentry_base::_Sentry_base(std::basic_ostream<char,std::char_traits<char> > & _Ostr={...})  Line 78   C++
    CAF.exe!std::basic_ostream<char,std::char_traits<char> >::sentry::sentry(std::basic_ostream<char,std::char_traits<char> > & _Ostr={...})  Line 95 + 0x4e bytes  C++
>   CAF.exe!std::operator<<<char,std::char_traits<char>,std::allocator<char> >(std::basic_ostream<char,std::char_traits<char> > & _Ostr={...}, const std::basic_string<char,std::char_traits<char>,std::allocator<char> > & _Str="###")  Line 549 + 0xc bytes   C++
    ...
Run Code Online (Sandbox Code Playgroud)

如果istream和ostream组件被单独锁定,我会没事的,但事实并非如此.

我可以使用流操作符的替代实现吗?我可以指示它不要锁吗?我应该实现自己的(不知道如何做到这一点)?

任何建议,将不胜感激.

(平台是Windows 32位和64位.使用Visual Studio 2003 …

c++ sockets windows string iostream

9
推荐指数
1
解决办法
1862
查看次数

将标题中的"extern"C"'声明为C++共享库的影响是什么?

基于这个问题,我理解了将C库与C++代码链接起来的构造的目的.现在假设如下:

我有一个用C++编译器编译的'.so'共享库.标题有一个'typedef stuct'和许多函数声明.如果标题包含extern"C"声明......

#ifdef __cplusplus
extern "C"
{
#endif

  // typedef struct ...;
  // function decls

#ifdef __cplusplus
}
#endif
Run Code Online (Sandbox Code Playgroud)

......有什么影响?具体来说,我想知道该声明是否存在任何有害的副作用,因为共享库被编译为C++,而不是C.

在这种情况下,有没有理由有外部"C"声明?

c c++ linux shared-libraries extern

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

在MATLAB中从Java加载库时出现UnsatisfiedLinkError

我已经在Windows上将简单的java模块集成到MATLAB环境中并取得了一些成功.最近我遇到了第三方库试图加载DLL的问题.

尝试加载时,java ClassLoader抛出UnsatisfiedLinkError:

java.lang.UnsatisfiedLinkError: no <libname> in java.library.path

at java.lang.ClassLoader.loadLibrary(Unknown Source)

at java.lang.Runtime.loadLibrary0(Unknown Source)

at java.lang.System.loadLibrary(Unknown Source)
Run Code Online (Sandbox Code Playgroud)

例外是报告我的'libname'不在java.library.path属性中.我已经验证该属性确实具有正确的路径,并且该路径上存在libname.dll文件.

我用两种方式验证了java.library.path.首先,我只是检查了MATLAB命令行返回的值:

>> java.lang.System.getProperty('java.library.path')
Run Code Online (Sandbox Code Playgroud)

然后,我修改了有问题的java方法,在调用失败的第三方函数之前打印该值:

System.out.println(System.getProperty('java.library.path'));
Run Code Online (Sandbox Code Playgroud)

两者都确认我的路径值已按预期设置.

我也尝试从命令行手动加载库,它失败并得到相同的结果.

这是MATLAB中无法实现的,还是我在这里遗漏了什么?不幸的是我不是这台机器的管理员,所以我不能尝试将dll移动到一个dll可以正常运行的目录中的老技巧.

如果没有绝对的答案,我欢迎任何有关事情的建议.

平台:Windows XP MATLAB R2009a Java 1.6

java windows dll matlab shared-libraries

5
推荐指数
2
解决办法
5787
查看次数

从不同版本的Visual Studio混合库时的运行时问题

运行我使用两个不同版本的Visual Studio构建的项目时遇到意外的访问错误.我的一般配置如下:

  • LibA是一个静态库,静态运行时链接,msvc 8.0
  • LibB是一个静态的lib,静态运行时链接,msvc 9.0
  • 我的集成目标项目是一个msvc 9.0 COM dll,它静态链接上面的库

此项目构建,但在运行时崩溃,在某些STL代码中存在访问冲突.堆栈似乎表明我在调用流插入操作符期间通过了两个版本(8和9)的头文件.我意识到这是一个问题.

不知何故,这个电话:

ost << std::dec << port_; //(originating from an object in LibA)
Run Code Online (Sandbox Code Playgroud)

...通过以下堆栈跟踪下降:

std::basic_ostream::operator<<(...) (ostream:283, msvc 8.0 version <-- expected, since LibA was built with this version)
std::num_put::put(...) (xlocnum:888, msvc 8.0 version <-- expected, since LibA was built with this version)
std::num_put::do_put(...) (xlocnum:1158, msvc 9.0 version!! !@#$!%! <-- not expected, since LibA was built with msvc 8.0)
std::ios_base::flags() (xiosbase:374, msvc 9.0 version <-- follows from above)
Run Code Online (Sandbox Code Playgroud)

访问冲突发生在std :: ios_base …

windows linker visual-studio visual-c++

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

什么是使用boost :: program_options的首选跨平台"主要"定义?

我正在尝试使用C++和boost开发一个跨平台的应用程序.

我通常在*nix环境中编程,我总是在其中定义'main',如下所示:

int main( const int argc, const char* argv[] )
{
...
}
Run Code Online (Sandbox Code Playgroud)

对于这个应用程序,我使用Visual Studio 2003在Windows环境中启动.

当我尝试使用带有此定义的boost :: program_options时,我从program_options :: store获得编译错误:

po::options_description desc("Supported options");
desc.add_options()...;
po::variables_map vm;
po::store(po::parse_command_line(argc, argv, desc), vm);
Run Code Online (Sandbox Code Playgroud)

错误:

main.cpp(46) : error C2665: 'boost::program_options::store' : none of the 2 overloads can convert parameter 1 from type 'boost::program_options::basic_parsed_options<charT>'
    with
    [
        charT=const char
    ]
    c:\boost_1_38_0\boost\program_options\variables_map.hpp(34): could be 'void boost::program_options::store(const boost::program_options::basic_parsed_options<charT> &,boost::program_options::variables_map &,bool)'
    with
    [
        charT=char
    ]
    c:\boost_1_38_0\boost\program_options\variables_map.hpp(43): or       'void boost::program_options::store(const boost::program_options::basic_parsed_options<wchar_t> &,boost::program_options::variables_map &)'
    while trying to match the …
Run Code Online (Sandbox Code Playgroud)

c++ portability visual-studio boost-program-options

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

Windows内存映射文件内容是否始终归零?

我已经根据经验确定,在我的系统上,默认情况下,创建为特定大小的内存映射文件始终完全归零.例如,使用呼叫

HANDLE hMM = 
    CreateFileMapping (h,
                        NULL,
                        PAGE_READWRITE,
                        0,
                        0x01400000,//20MB
                        NULL);
Run Code Online (Sandbox Code Playgroud)

..并且写入该文件的映射视图总是会导致20MB的文件完全归零,除非我写了非零数据.

我想知道文件的未初始化部分是否可以假定为零.这种行为一般在Windows上得到保证吗?

c++ windows kernel memory-mapped-files

3
推荐指数
2
解决办法
1787
查看次数

Visual Studio:如何构建静态库以在另一个项目中使用(避免STL链接错误)

我是Visual Studio和Windows的新手,作为一个开发平台,我很难将静态库从一个'Project'链接到另一个'Project'中的可执行文件.该库构建时没有错误,但在找到库中定义的几个STL模板实例后链接bails.

出于此问题的目的,项目A构建了一个静态库,然后我尝试在项目B中进行链接.

我希望有人能指出我在这里缺少的东西.

项目A的构建命令行:

/Od <includes> /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_WIN32_WINNT=0x0501" /D "DEBUG" /D "WS4_WIN32" /D "AF" /D "_VC80_UPGRADE=0x0710" /D "_MBCS" /Gm /EHsc /RTC1 /MTd /Fo"Debug\\" /Fd"Debug\vc90.pdb" /W3 /nologo /c /Wp64 /ZI /TP /wd4290 /errorReport:prompt
Run Code Online (Sandbox Code Playgroud)

项目B的构建和链接命令行:

/Od <includes> /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_UNICODE" /D "UNICODE" /Gm /EHsc /RTC1 /MDd /Fo"Debug\\" /Fd"Debug\vc90.pdb" /W3 /nologo /c /ZI /TP /wd4290 /errorReport:prompt  
/OUT:<exe name> /INCREMENTAL /NOLOGO /MANIFEST /MANIFESTFILE:"<exe name>.intermediate.manifest" /MANIFESTUAC:"level='asInvoker' uiAccess='false'" /DEBUG /PDB:<pdb name> /SUBSYSTEM:CONSOLE /DYNAMICBASE /NXCOMPAT …
Run Code Online (Sandbox Code Playgroud)

c++ linker static visual-studio

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

使用Windows SDK 7.1与Visual Studio 2005链接错误

我正在评估升级到Windows SDK 7.1的过程

我团队的遗留代码库的一部分是大量的ATL Web服务,它们仍然使用Visual Studio 2005进行维护,因为(据我所知)2005年以后的版本不支持ATL Web服务.

当我将IDE指向SDK 7.1时,我开始收到以下链接错误:

uuid.lib(cguid_i.obj) : fatal error LNK1103: debugging information corrupt; recompile module
Run Code Online (Sandbox Code Playgroud)

我在VS2005和SDK 7.1中无法在网络上找到与此问题相关的内容.我在2005年发现了一些关于同样错误的论坛帖子 - 它们似乎表明SDK不兼容.

基于下载页面,我的印象是Windows SDK 7.1可以与Visual Studio 2005一起使用(尽管我注意到"并非所有功能都适用于所有版本的Visual Studio"免责声明).

这是一个已知问题,还是我的配置不正确?

我希望有人可以分享他们的经验或建议如何/如果我能够解决这个问题.

编辑:我发现通过在链接器命令行上禁用/ DEBUG可以避免此问题.虽然允许构建完成,但这不是最理想的,因为它阻止了在将来的维护期间进行调试.

c++ winapi visual-studio-2005 linker-errors

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