小编Bai*_*ang的帖子

为什么ostringstream比ofstream更快

要将许多数据写入文件,我有两种方法:

  1. 直接写入ofstream流

    ofstream file("c:\\test.txt");
    for (int i = 0; i < 10000; ++i)
    {
        file << data[i];
    }
    
    Run Code Online (Sandbox Code Playgroud)
  2. 首先写入istringstream,然后立即写入ofstream

    ostringstream strstream;
    for (int i = 0; i < 10000; ++i)
    {
        strstream << data[i];
    }
    ofstream file("c:\\test.txt");
    file << strstream.str();
    
    Run Code Online (Sandbox Code Playgroud)

毫不奇怪,第二种方法更快,事实上,它比我的HP7800机器上的第一种方法快4倍.

但为什么?我知道ofstream正在使用filebuf,而ostringstream正在使用stringbuf - 作为缓冲区,它们都应该驻留在内存中,因此应该没有区别.

引擎盖下有什么区别?

c++ iostream filestream

10
推荐指数
2
解决办法
3679
查看次数

如何在没有tlb文件的情况下使用进程外COM服务器

它是关于Window COM组件的.

  • Server.exe:一个32位进程外COM服务器
  • CLSID_Application:Server.exe中COM对象的GUID
  • Client.exe:64位客户端应用程序,以无注册表的方式使用Server.exe.

我们知道,exe不能用作无注册表的COM组件,模仿这种行为,我通过提供确切的路径自己启动Server.exe进程:

  • 的CreateProcess( "SERVER.EXE")
  • IClassFactory*pFactory = CoGetClassObject(CLSID_Application)
  • pFactory->的CreateInstance(ppAppObject);

如果我注册了Server.tlb,它可以正常工作,但是在取消注册Server.tlb之后,它只是无法创建ppAppObject,即使我将清单嵌入到Server.exe和Client.exe中:

<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<file name="Server.tlb">
  <typelib tlbid="{DAC4A4C9-F84C-4F05-A7DC-E152869499F5}" version="1.0" helpdir=""></typelib>
</file>
<comInterfaceExternalProxyStub name="IApplication" iid="{D74208EA-71C2-471D-8681-9760B8ECE599}" tlbid="{DAC4A4C9-F84C-4F05-A7DC-E152869499F5}" proxyStubClsid32="{00020424-0000-0000-C000-000000000046}"></comInterfaceExternalProxyStub>
</assembly>
Run Code Online (Sandbox Code Playgroud)

你对此有什么想法吗?

编辑:事实证明,如果我为接口指定tlbid并将清单嵌入到两个exe中,它确实有效

com regfreecom out-of-process

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

为什么禁用CObject的复制构造函数和赋值

默认情况下禁用MFC的根对象CObject的复制构造函数和赋值.

标准C++默认类复制构造函数执行成员复制.如果需要类的复制构造函数但不可用,则私有CObject复制构造函数的存在可保证编译器错误消息.因此,如果您的类需要此功能,则必须提供复制构造函数.

  • 在CObject的源代码中,有一个注释:

默认情况下禁用复制构造函数和赋值,因此如果按值传递对象或分配对象,则会出现编译器错误而不是意外行为.

我的问题是,这个CObject类的默认逐位复制构造函数有什么问题?在我看来,最好给我们一个默认的拷贝构造函数,如果需要我们可以提供一个(深拷贝)

c++ mfc constructor

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

我们可以在一个进程中加载​​2个具有相同名称的DLL

我说的是win32 dll,那些普通的pe文件.与我在explorer.exe进程中看到的相比,我在进行测试后感到困惑.

  1. 我用以下模块编写了一个测试:(C++)
    DLLLoader.exe链接到同一文件夹中的A.dll.
    B.dll链接到另一个文件夹中的A.dll(2).(A.dll(2)是与A.dll完全不同的DLL,但具有相同的名称)
    DLLLoader.exe将通过:: LoadLibrary显式加载B.dll.
    现在我开始DllLoader.exe,首先,A.DLL将被载入,但是当它试图加载B.DLL,它只是失败:我怀疑是因为B.DLL认为A.DLL已经加载的过程,但实际上,加载的一个不是B.dll想要的那个,导入/导出表无法匹配,所以B.dll无法加载.
    这似乎告诉我们,我们不能在同一个进程中加载​​2个同名的dll,即使它们有不同的路径.

  2. 但是,当我使用进程资源管理器来监视Windows的explorer.exe进程中加载​​的模块时,我可以看到以下两个dll被加载,具有相同的名称:
    comctl32.dll用户体验控件库C:\ WINDOWS\WinSxS ...\comctl32.dll
    comctl32.dll公共控件库C:\ WINDOWS\system32\comctl32.dll

你们中的任何人都可以对此有所了解吗?

dll process

7
推荐指数
2
解决办法
8279
查看次数

如何在批处理脚本中嵌入python代码

在bash中,我们可以:

python - << EOF
import os
print 'hello'
EOF
Run Code Online (Sandbox Code Playgroud)

在bash脚本中嵌入python代码片段.

但是在Windows批处理中,这不起作用 - 尽管我仍然可以使用python -c,但这需要我将我的代码拼写成一行,这是我试图避免的.

有没有办法在批处理脚本中实现这一点?

谢谢.

python windows bash batch-file

7
推荐指数
2
解决办法
3561
查看次数

询问有关快速光线跟踪算法的资源

首先,我很抱歉这个粗略的问题,但我不想介绍太多细节,所以我只是要求提供相关资源,如文章,图书馆提示.

我的程序需要对射线 - 三角形交叉点进行密集计算(有数百万个光线和三角形),我的目标是尽可能快地完成.

我所做的是:

  1. 使用我所知道的最快的ray-triangle算法.

  2. 使用八叉树(来自Game Programming Gem 1,4.10.4.11)

  3. 使用一种高效且稳健的Ray-Box交叉算法,该算法用于八叉树算法.

它比我应用那些更好的算法之前更快,但我相信它可能会更快,你能不能点亮任何可能使它更快的地方?

谢谢.

algorithm performance geometry raytracing

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

如何确定长函数返回的位置

假设有一个名为LongFunction的1000行代码的函数,我们使用它:

bool bSuccess = LongFunction();
assert(bSuccess);
Run Code Online (Sandbox Code Playgroud)

这里我在调试时得到一个断言,我知道LongFunction有问题,所以我需要找到函数遇到问题的地方并返回:

  1. 我可以一步一步地调试它,它可以工作,但是很费时,我们不这样做.

  2. 我可以搜索关键字"返回"(或者更精确的搜索使用RegExp),并在那些返回时设置断点,它应该更快,但它仍然是乏味的手动工作,无法自动化.

  3. #define返回TRACE(LINE); 返回

它有效,但有以下问题:

  • 它会打印太多冗余信息,因为经常使用返回.(或者我们可以使用一些EnvVar来打开或关闭它)
  • 不适用于以下情况:if(bOK)返回true;

您对如何查明问题还有其他创意吗?

编辑: 这里有一些细节让我们专注于这个问题.

  1. 它是关于C++,而不是平台规范.

  2. 我们不想重构函数(是的,我知道我们应该),我们甚至不想更改任何代码 - 此时我们只想提供一些工具来使我们的应用程序调试更容易.我也相信这应该是一个共同的要求,难道你不碰到这个吗?

  3. LongFunction()有多个退出点,返回类型不是必需的bool(HRESULT,用户定义的错误代码......)

编辑:当前讨论的摘要:
我们有一些争议:

  1. 你应该重构这个功能.
    是的,每个人都知道我们应该,但这不是重点.如果我打电话重构函数,我不会在这里问这个问题.

  2. 找到LongFunction()返回失败的地方没有帮助.
    我总是首先找到错误发生的地方,知道发生了什么,我很好奇为什么这没有用,你在这种情况下做了什么?(假设我已经熟悉该函数的工作原理)

我们有2个合理的解决方案:

  1. 来自Crashworks的ReturnMarker,函数中的堆栈对象将在函数返回时进行破坏,在析构函数中设置断点将显示它在debuger中返回的位置

  2. 来自Binary&Sadsido的CMyBool(x),将LongFunction的返回类型更改为可以从bool构造的CMyBool,从LongFunction返回将构造该对象,因此只需在构造函数中设置断点即可.

c c++ return

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

如何在Win7中模拟重新启动以测试应用程序冷启动时间

为了测量应用程序的冷启动时间,我每次都必须重新启动机器,这非常耗时.我理解这是不可能模拟真正重启的任务,但我想要的是粗略的,ex,尽可能多地在待机列表中放出缓存,所以热启动将不再那么温暖.

有什么想法吗?

谢谢

windows performance

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

为什么operator =不从模板类继承

我有以下模板代码:

class ClassName{};

template <class T>
class TemplatePtr
{
public:
    void operator=(T* p)
    {

    }
};

class TemplatePtr_ClassName: public TemplateePtr<ClassName>
{
public:
    ~TempaltePtr_ClassName();
};


void Test()
{
    TemplatePtr_ClassName data;
    data = new ClassName;
}
Run Code Online (Sandbox Code Playgroud)

但编译失败并显示错误消息(VS2008):

错误C2679:二进制"=":没有操作员发现它采用类型>>"类名*"的右边的操作数(或没有可接受的转化率)

为什么它不起作用,因为我在模板基类中定义了一个运算符?

c++ inheritance templates

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

我们可以使用jdk7 javac将java7特性的代码编译成java6字节码

我正在考虑一个java项目是否可以生成2个jar:一个用于java7,一个用于java6,是的,源代码可能会使用一些java7新功能.

所以要生成java6 jar,命令行就像:

javac -target 1.6 -bootclasspath jdk1.6.0\lib\rt.jar -extdirs "" MyApp.java
Run Code Online (Sandbox Code Playgroud)

不幸的是,它只是发出一个错误:

javac: target release 1.6 conflicts with default source release 1.7
Run Code Online (Sandbox Code Playgroud)

根据这个文件,应该有可能jdk6 vs jdk5,任何人都知道为什么它在jdk7 vs jdk6中不起作用?我做错了什么,还是只是官方不支持?

谢谢.

java compatibility java-7

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