小编0xC*_*ACE的帖子

如何使用反向迭代器调用erase

我想做这样的事情:

for ( std::list< Cursor::Enum >::reverse_iterator i = m_CursorStack.rbegin(); i != m_CursorStack.rend(); ++i )
{
    if ( *i == pCursor )
    {
        m_CursorStack.erase( i );
        break;
    }
}
Run Code Online (Sandbox Code Playgroud)

但是擦除需要迭代器而不是反向迭代器.有没有办法将反向迭代器转换为常规迭代器或从列表中删除此元素的另一种方法?

c++

165
推荐指数
4
解决办法
6万
查看次数

获取目录中的文件夹列表

如何使用ruby获取某个目录中存在的文件夹列表?

Dir.entries() 看起来很近但我不知道如何限制文件夹.

ruby directory directory-listing

87
推荐指数
5
解决办法
6万
查看次数

提升序列化与谷歌协议缓冲?

有这些图书馆经验的人对他们喜欢哪一个有任何评论吗?使用中是否存在任何性能差异或困难?

c++ performance serialization protocol-buffers boost-serialization

64
推荐指数
8
解决办法
2万
查看次数

如何捕获空指针异常?

  try {
        int* p = 0;
        *p = 1;
    } catch (...) {
        cout << "null pointer." << endl;
    }
Run Code Online (Sandbox Code Playgroud)

我试图抓住这样的例外,但它没有用,有什么帮助吗?

c++ exception-handling try-catch

41
推荐指数
5
解决办法
7万
查看次数

在Visual Studio中启用单个警告

是否有编译器开关在Visual Studio中启用单个警告?

我问的原因是我想启用警告C4265默认关闭.我的搜索只是找到了关闭警告的方法.

甚至称为如何:启用或禁用编译器警告的 Microsoft页面仍然只提到禁用.

c++ warnings visual-studio

26
推荐指数
2
解决办法
2万
查看次数

使用repro代码在第二次运行应用程序时加载文件较慢

应用说明

我有一个离线数据处理工具.该工具可加载数十万个文件.对于每一个,它执行一些计算,并在完成时写入一个索引文件.它是所有C++(所有IO都是通过标准库对象/函数),并且正在使用针对amd64的Visual Studio 2013进行编译.

性能

我的测试数据集有115,757个需要处理的文件.文件总大小为731MB,中位文件大小为6KB.

  • 首次运行:12秒
  • 第二轮:约18分钟

多慢了90倍!第二次运行是从运行时间的一分钟推断出来的.之后的所有运行,正如我迄今为止所经历的那样,同样缓慢.

惊喜!

如果我用其中的文件重命名文件夹,然后将其重命名为原来的版本,则下次运行应用程序时,它将再次快速执行!

它的应用程序,机器和源数据相同.唯一的区别是暂时重命名了一个文件夹.

到目前为止,我可以在100%的时间内重现这一点.

剖析

当然,下一步是剖析.我描述了快速运行和慢速运行并比较了热点.在慢速版本中,大约86%的应用程序花费在一个名为的函数中NtfsFindPrefix.快速版本在此约占0.4%的时间.这是调用堆栈:

Ntfs.sys!NtfsFindPrefix<itself>
Ntfs.sys!NtfsFindPrefix
Ntfs.sys!NtfsFindStartingNode
Ntfs.sys!NtfsCommonCreate
Ntfs.sys!NtfsCommonCreateCallout
ntoskrnl.exe!KySwitchKernelStackCallout
ntoskrnl.exe!KiSwitchKernelStackContinue
ntoskrnl.exe!KeExpandKernelStackAndCalloutEx
Ntfs.sys!NtfsCommonCreateOnNewStack
Ntfs.sys!NtfsFsdCreate
fltmgr.sys!FltpLegacyProcessingAfterPreCallbacksCompleted
fltmgr.sys!FltpCreate
ntoskrnl.exe!IopParseDevice
ntoskrnl.exe!ObpLookupObjectName
ntoskrnl.exe!ObOpenObjectByName
ntoskrnl.exe!NtQueryAttributesFile
ntoskrnl.exe!KiSystemServiceCopyEnd
ntdll.dll!NtQueryAttributesFile
KernelBase.dll!GetFileAttributesW
DataGenerator.exe!boost::filesystem::detail::status
Run Code Online (Sandbox Code Playgroud)

有问题的提升通话是一个exists电话.它将测试文件的压缩版本,找不到它,然后测试解压缩的文件并找到它.

分析还显示磁盘没有受到应用程序运行的影响,但文件IO预计会很高.我相信这表明文件已经被分页到内存.

文件IO还显示文件"创建"事件的持续时间在慢速版本中平均更高.26 us vs 11704 us.

  • 三星SSD 830系列
  • 英特尔i7 860
  • Windows 7 64位
  • NTFS文件系统.
  • 32GB Ram

摘要

  • 在第二次运行时,呼叫NtfsFindPrefix需要更长的时间.
  • 这是NTFS驱动程序中的一个函数.
  • 磁盘在任一配置文件中都没有被命中,文件是从内存中的页面提供的.
  • 重命名操作似乎足以阻止在下次运行时发生此问题.

现在背景信息已经不在了,有没有人认识到发生了什么并且知道如何修复它?

看起来我可以通过自己重命名文件夹来解决它,但这似乎......很脏.加上我不知道为什么甚至有效.

重命名是否使内存中的页面无效并导致它们在下次运行之前得到更新?这是NTFS驱动程序中的错误吗?

谢谢阅读! …

c++ performance ntfs windows-7-x64 visual-studio-2013

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

为什么删除的内存无法重用

我在带有MSVC 9.0的Windows 7上使用C++,并且还能够在带有MSVC 9.0的Windows XP SP3上进行测试和再现.

如果我分配1 GB的0.5 MB大小的对象,当我删除它们时,一切正常并且按预期运行.但是,如果在删除它时分配1 GB的0.25 MB大小的对象,则内存保留(地址空间监视器中为黄色),从那时起,只能用于小于0.25 MB的分配.

这个简单的代码将允许您通过更改typedef的结构来测试这两种情况.在分配并删除了结构后,它将分配1 GB的1 MB char缓冲区,以查看char缓冲区是否将使用结构体曾经占用的内存.

struct HalfMegStruct
{
    HalfMegStruct():m_Next(0){}

    /* return the number of objects needed to allocate one gig */
    static int getIterations(){ return 2048; }

    int m_Data[131071];
    HalfMegStruct* m_Next;
};

struct QuarterMegStruct
{
    QuarterMegStruct():m_Next(0){}

    /* return the number of objects needed to allocate one gig */
    static int getIterations(){ return 4096; }

    int m_Data[65535];
    QuarterMegStruct* m_Next;
};

// which struct to use
typedef QuarterMegStruct UseType; …
Run Code Online (Sandbox Code Playgroud)

c++ allocator dynamic-memory-allocation windows-7

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

C++:多态复制构造函数可以工作吗?

考虑:

class A
{
public:
    A( int val ) : m_ValA( val ) {}
    A( const A& rhs ) {}
    int m_ValA;
};

class B : public A
{
public:
    B( int val4A, int val4B ) : A( val4A ), m_ValB( val4B ) {}
    B( const B& rhs ) : A( rhs ), m_ValB( rhs.m_ValB ) {}
    int m_ValB;
};

int main()
{
    A* b1 = new B( 1, 2 );
    A* b2 = new A( *b1 ); // ERROR...but …
Run Code Online (Sandbox Code Playgroud)

c++ copy-constructor

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

从专有应用程序中调用 7-Zip 的许可影响

我想在我的专有应用程序中使用 7-Zip。

7-Zip 是 LGPL

考虑一下,在我的应用程序中,我使用以下内容通过其命令行界面调用system()system( "7-Zip -blah -blah" );

  1. 如果我以这种方式使用 7-Zip,我是否对 LGPL 有任何义务?
  2. 如果我想将 7-Zips 的 7z.dll 和 7z.exe 与我的应用程序一起分发,以便用户不需要单独安装 7-Zip,我是否对 LGPL 有任何义务?

谢谢

lgpl 7zip

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

以编程方式创建Zip文件C++

我试图找到一个允许我生成zip文件的库.我有一个文件列表,我想放入存档.我的第一个建议是使用zlib的boost,但结果却是死路一条.我也看了zziplib,但它是一个只读的lib.

如果有人有这方面的经验,并且在我希望听到它之前成功使用过lib.

这适用于MSVC9中的C++项目,lib必须可以免费使用.

c++ zip

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

仅使用svn触发对提交到trunk的构建

我刚刚在我们的subversion存储库中设置了一个post-commit脚本,它通过请求一个hudson构建URL来触发构建.

这可以正常工作,但是现在我只想在提交到主干时触发此构建.

我们的提交后脚本如下所示:

SET REPOS=%1
SET REV=%2

SET DIR=%REPOS%/hooks
SET PATH=%PATH%;%DIR%
wget http://circus-09:8080/job/UE/build?delay=0sec
Run Code Online (Sandbox Code Playgroud)

如何检查提交是否到主干?

svn hudson post-commit

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

修改C字符串:访问冲突

可能的重复:
为什么简单的C代码会收到分段错误?
修改C字符串常量?

为什么此代码会产生访问冲突?

int main()
{
    char* myString = "5";
    *myString = 'e'; // Crash
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

c c++ string

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

为什么删除内存不可用?C++

我有一个200 MB的 XML文件,我正在使用TinyXML加载.我的问题是,当TinyXML对象被销毁时,它使用的内存将不会被重用.我使用过我在其他项目中使用的内存泄漏检测器,并且已经手动逐步执行代码并且无法找到任何内存泄漏,因此我不怀疑泄漏的内存是问题所在.

此代码将重现该问题:

#include <iostream>
#include <tinyxml.h>

int main()
{
    char* filename = "../LargeFile.xml";

    {
        TiXmlDocument targetDoc( filename );
        targetDoc.LoadFile();
    }

    char* buf = new char[ 524288000 ];
    delete [] buf;

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

使用地址空间监视器我可以看到,在LoadFile()有一大块红色后,然后targetDoc被破坏后它全部变黄.然后,当分配最终的char buf时,它显示为红色,但是在绿色空间的顶部,而不是从TinyXML中释放的黄色.如果尝试分配比绿色地址空间更多的缓冲区,应用程序将崩溃(内存不足).这可以在下面的图像中看到.

加载后 卸载后 Char缓冲区分配

根据地址空间监视器页面"自由地址空间以绿色显示,保留地址以黄色显示,已使用(已提交)内存区域以红色显示"因此,根据地址空间监视器,为什么TinyXML释放的内存保持"保留"状态.什么可能导致这种情况发生,我该如何阻止它?

编辑:

"你在分配大缓冲区吗?如果是这样,那么黄色空间中可能存在内存碎片,并且无法分配大的连续缓冲区"

但是很好的问题表明TinyXML存在内存泄漏,我的工具都没有显示出来.

UPDATE

我做了循环,无休止地分配整数,最终似乎使用了所有的黄色空间.但是,更大的分配不使用它.这向我表明,在通过tinyXML解析xml文件期间,堆中出现了一些小漏洞,这些漏洞以一种方式对堆进行分段,使得只有小到足以容纳漏洞的对象才能在黄色空间中分配.所以我在TinyXML中搜索越来越长的漏洞,但仍未找到任何漏洞.一切似乎都得到了正确的释放,这让我回到了最初的困惑状态.

我无法解释这个问题.

Char缓冲区分配 Char Buffer Allocation2 Char Buffer Allocation3

c++ memory-management tinyxml

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