要将许多数据写入文件,我有两种方法:
直接写入ofstream流
ofstream file("c:\\test.txt");
for (int i = 0; i < 10000; ++i)
{
file << data[i];
}
Run Code Online (Sandbox Code Playgroud)首先写入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 - 作为缓冲区,它们都应该驻留在内存中,因此应该没有区别.
引擎盖下有什么区别?
它是关于Window COM组件的.
我们知道,exe不能用作无注册表的COM组件,模仿这种行为,我通过提供确切的路径自己启动Server.exe进程:
如果我注册了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中,它确实有效
默认情况下禁用MFC的根对象CObject的复制构造函数和赋值.
标准C++默认类复制构造函数执行成员复制.如果需要类的复制构造函数但不可用,则私有CObject复制构造函数的存在可保证编译器错误消息.因此,如果您的类需要此功能,则必须提供复制构造函数.
默认情况下禁用复制构造函数和赋值,因此如果按值传递对象或分配对象,则会出现编译器错误而不是意外行为.
我的问题是,这个CObject类的默认逐位复制构造函数有什么问题?在我看来,最好给我们一个默认的拷贝构造函数,如果需要我们可以提供一个(深拷贝)
我说的是win32 dll,那些普通的pe文件.与我在explorer.exe进程中看到的相比,我在进行测试后感到困惑.
我用以下模块编写了一个测试:(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,即使它们有不同的路径.
但是,当我使用进程资源管理器来监视Windows的explorer.exe进程中加载的模块时,我可以看到以下两个dll被加载,具有相同的名称:
comctl32.dll用户体验控件库C:\ WINDOWS\WinSxS ...\comctl32.dll
comctl32.dll公共控件库C:\ WINDOWS\system32\comctl32.dll
你们中的任何人都可以对此有所了解吗?
在bash中,我们可以:
python - << EOF
import os
print 'hello'
EOF
Run Code Online (Sandbox Code Playgroud)
在bash脚本中嵌入python代码片段.
但是在Windows批处理中,这不起作用 - 尽管我仍然可以使用python -c,但这需要我将我的代码拼写成一行,这是我试图避免的.
有没有办法在批处理脚本中实现这一点?
谢谢.
首先,我很抱歉这个粗略的问题,但我不想介绍太多细节,所以我只是要求提供相关资源,如文章,图书馆或提示.
我的程序需要对射线 - 三角形交叉点进行密集计算(有数百万个光线和三角形),我的目标是尽可能快地完成.
我所做的是:
使用我所知道的最快的ray-triangle算法.
使用八叉树(来自Game Programming Gem 1,4.10.4.11)
使用一种高效且稳健的Ray-Box交叉算法,该算法用于八叉树算法.
它比我应用那些更好的算法之前更快,但我相信它可能会更快,你能不能点亮任何可能使它更快的地方?
谢谢.
假设有一个名为LongFunction的1000行代码的函数,我们使用它:
bool bSuccess = LongFunction();
assert(bSuccess);
Run Code Online (Sandbox Code Playgroud)
这里我在调试时得到一个断言,我知道LongFunction有问题,所以我需要找到函数遇到问题的地方并返回:
我可以一步一步地调试它,它可以工作,但是很费时,我们不这样做.
我可以搜索关键字"返回"(或者更精确的搜索使用RegExp),并在那些返回时设置断点,它应该更快,但它仍然是乏味的手动工作,无法自动化.
#define返回TRACE(LINE); 返回
它有效,但有以下问题:
您对如何查明问题还有其他创意吗?
编辑: 这里有一些细节让我们专注于这个问题.
它是关于C++,而不是平台规范.
我们不想重构函数(是的,我知道我们应该),我们甚至不想更改任何代码 - 此时我们只想提供一些工具来使我们的应用程序调试更容易.我也相信这应该是一个共同的要求,难道你不碰到这个吗?
LongFunction()有多个退出点,返回类型不是必需的bool(HRESULT,用户定义的错误代码......)
编辑:当前讨论的摘要:
我们有一些争议:
你应该重构这个功能.
是的,每个人都知道我们应该,但这不是重点.如果我打电话重构函数,我不会在这里问这个问题.
找到LongFunction()返回失败的地方没有帮助.
我总是首先找到错误发生的地方,知道发生了什么,我很好奇为什么这没有用,你在这种情况下做了什么?(假设我已经熟悉该函数的工作原理)
我们有2个合理的解决方案:
来自Crashworks的ReturnMarker,函数中的堆栈对象将在函数返回时进行破坏,在析构函数中设置断点将显示它在debuger中返回的位置
来自Binary&Sadsido的CMyBool(x),将LongFunction的返回类型更改为可以从bool构造的CMyBool,从LongFunction返回将构造该对象,因此只需在构造函数中设置断点即可.
为了测量应用程序的冷启动时间,我每次都必须重新启动机器,这非常耗时.我理解这是不可能模拟真正重启的任务,但我想要的是粗略的,ex,尽可能多地在待机列表中放出缓存,所以热启动将不再那么温暖.
有什么想法吗?
谢谢
我有以下模板代码:
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:二进制"=":没有操作员发现它采用类型>>"类名*"的右边的操作数(或没有可接受的转化率)
为什么它不起作用,因为我在模板基类中定义了一个运算符?
我正在考虑一个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中不起作用?我做错了什么,还是只是官方不支持?
谢谢.
c++ ×4
performance ×2
windows ×2
algorithm ×1
bash ×1
batch-file ×1
c ×1
com ×1
constructor ×1
dll ×1
filestream ×1
geometry ×1
inheritance ×1
iostream ×1
java ×1
java-7 ×1
mfc ×1
process ×1
python ×1
raytracing ×1
regfreecom ×1
return ×1
templates ×1