假设以下内容...
输出:
文件打开...
数据"流式传输"到磁盘.内存中的数据位于一个大的连续缓冲区中.它直接从该缓冲区以原始格式写入磁盘.缓冲区的大小是可配置的,但在流的持续时间内是固定的.缓冲区一个接一个地写入文件.没有进行任何搜寻行动.
...文件已关闭.
输入:
从头到尾从磁盘读取一个大文件(按上面顺序写入).
是否有通用的指南来实现C++中最快的顺序文件I/O?
一些可能的考虑:
我意识到这将有特定于平台的考虑因素.我欢迎一般准则以及特定平台的准则.
(我对Win x64最直接的兴趣,但我也对Solaris和Linux上的评论感兴趣)
在代码审查期间,我遇到了一些定义简单结构的代码,如下所示:
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 /编译器的变化)可能会失败?
我在MATLAB中使用极坐标图(POLAR(THETA,RHO)).
是否有一种简单的方法来确定径向轴的范围,比如1.5?
我正在寻找类似于笛卡尔坐标轴的xlim,ylim命令的东西.尚未在文档中找到任何内容.
我是一名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库与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"声明?
我已经在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
运行我使用两个不同版本的Visual Studio构建的项目时遇到意外的访问错误.我的一般配置如下:
此项目构建,但在运行时崩溃,在某些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 …
我正在尝试使用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) 我已经根据经验确定,在我的系统上,默认情况下,创建为特定大小的内存映射文件始终完全归零.例如,使用呼叫
HANDLE hMM =
CreateFileMapping (h,
NULL,
PAGE_READWRITE,
0,
0x01400000,//20MB
NULL);
Run Code Online (Sandbox Code Playgroud)
..并且写入该文件的映射视图总是会导致20MB的文件完全归零,除非我写了非零数据.
我想知道文件的未初始化部分是否可以假定为零.这种行为一般在Windows上得到保证吗?
我是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) 我正在评估升级到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可以避免此问题.虽然允许构建完成,但这不是最理想的,因为它阻止了在将来的维护期间进行调试.