我正在阅读Herb Sutter的"Exceptional C++"一书,在那本书中我学到了关于pImpl的习语.基本上,我们的想法是为a的private对象创建一个结构class并动态分配它们以减少编译时间(并且还以更好的方式隐藏私有实现).
例如:
class X
{
private:
C c;
D d;
} ;
Run Code Online (Sandbox Code Playgroud)
可以改为:
class X
{
private:
struct XImpl;
XImpl* pImpl;
};
Run Code Online (Sandbox Code Playgroud)
并且,在CPP中,定义:
struct X::XImpl
{
C c;
D d;
};
Run Code Online (Sandbox Code Playgroud)
这看起来很有趣,但我以前从未见过这种方法,既没有在我工作的公司,也没有在我看过源代码的开源项目中.所以,我想知道这种技术真的在实践中使用了吗?
我应该在任何地方使用它,还是谨慎使用?这种技术是否建议用于嵌入式系统(性能非常重要)?
我试图检测是否释放了一块内存.当然,经理告诉我通过对话框或日志文件,但如果我想将结果存储在数据库中该怎么办?例如,我想在数据库表中包含分配给定块的例程的名称.
在阅读了FastMM的文档之后,我知道从版本4.98开始,我们有可能被管理员通知内存分配,释放和重新分配.例如,OnDebugFreeMemFinish事件传递给我们a PFullDebugBlockHeader包含有用的信息.PFullDebugBlockHeader缺少一件事- 如果给定的块被应用程序释放,则会显示信息.
除非OnDebugFreeMemFinish仅为未释放的块调用?这是我不知道并想知道的.
问题是,即使挂钩OnDebugFreeMemFinish事件,我也无法找出该块是否被释放.
这是一个例子:
program MemLeakTest;
{$APPTYPE CONSOLE}
uses
FastMM4, ExceptionLog, SysUtils;
procedure MemFreeEvent(APHeaderFreedBlock: PFullDebugBlockHeader; AResult: Integer);
begin
//This is executed at the end, but how should I know that this block should be freed
//by application? Unless this is executed ONLY for not freed blocks.
end;
procedure Leak;
var
MyObject: TObject;
begin
MyObject := TObject.Create;
end;
begin
OnDebugFreeMemFinish := MemFreeEvent;
Leak;
end.
Run Code Online (Sandbox Code Playgroud)
我缺少的是回调,如:
procedure OnMemoryLeak(APointer: PFullDebugBlockHeader);
Run Code Online (Sandbox Code Playgroud)
在浏览FastMM的源代码后,我发现有一个过程: …
我正在学习汇编程序很长一段时间,我正在尝试重写一些简单的过程\函数来查看性能优势(如果有的话).我的主要开发工具是Delphi 2007,第一个例子将使用该语言,但它们也可以很容易地翻译成其他语言.
问题表明:
我们给出了一个无符号字节值,其中八位中的每一位代表一行屏幕中的一个像素.每个单个像素可以是实心(1)或透明(0).换句话说,我们在一个字节值中包含8个像素.我想将这些像素解压缩成一个8字节的数组,就像最年轻的像素(位)将落在数组的最低索引之下一样,依此类推.这是一个例子:
One byte value -----------> eight byte array
10011011 -----------------> [1][1][0][1][1][0][0][1]
Array index number -------> 0 1 2 3 4 5 6 7
Run Code Online (Sandbox Code Playgroud)
下面我介绍解决问题的五种方法.接下来,我将展示他们的时间比较以及我如何衡量这些时间.
我的问题包括两部分:
我问您详细的有关方法的答案DecodePixels4a和DecodePixels4b.为什么方法4b有点慢4a?
例如,如果我的代码没有正确对齐,它会慢一些,那么告诉我给定方法中哪些指令可以更好地对齐,以及如何做到这一点不破坏方法.
我想看看这个理论背后的真实例子.请记住,我正在学习汇编,我想从你的答案中获得知识,这使我将来能够编写更好的优化代码.
你能写更快的常规DecodePixels4a吗?如果是,请提供并描述您已采取的优化步骤.通过更快的例程,我的意思是在测试环境中在最短的时间段内运行的例程,在此处提供的所有例程中.
允许使用所有Intel系列处理器以及与之兼容的处理器.
您将在下面找到我编写的例程:
procedure DecodePixels1(EncPixels: Byte; var DecPixels: TDecodedPixels);
var
i3: Integer;
begin
DecPixels[0] := EncPixels and $01;
for i3 := 1 to 7 do
begin
EncPixels := EncPixels shr 1;
DecPixels[i3] := …Run Code Online (Sandbox Code Playgroud) 我正在寻找一些允许我生成逼真的2D地形图的算法.通过现实我的意思是,这个人会将这样的地图视为"普通"地形图,而不是人工创建的.我不想创建逼真的地图.只是类似于可以在地理地图集中查看的地图.
到目前为止,我正在使用perlin噪音进行高度测绘,然后我会添加湖泊,河流,山脉,沼泽等.您可以在下面的图片中查看它的外观:
地形图http://www.freeimagehosting.net/uploads/1f1e9372bf.png
我对它不满意.这是不现实的,但我不能自己找出更好的东西.时间不是问题所以算法可能是繁重的计算.
谢谢你的时间.
编辑后:
我想我找到了一篇可以提供帮助的文章:http://portal.acm.org/citation.cfm?id = 1255047.1255077
然而,它不能免费获得,所以我仍然在寻找答案或想法.
我想将我的对象序列化为xml,然后序列化为字符串.
public class MyObject
{
[XmlElement]
public string Name
[XmlElement]
public string Location;
}
Run Code Online (Sandbox Code Playgroud)
我想获得一个单行字符串,它会像这样:
<MyObject><Name>Vladimir</Name><Location>Moskov</Location></MyObject>
Run Code Online (Sandbox Code Playgroud)
我正在使用这样的代码:
XmlWriterSettings settings = new XmlWriterSettings();
settings.OmitXmlDeclaration = true;
settings.Indent = true;
StringWriter StringWriter = new StringWriter();
StringWriter.NewLine = ""; //tried to change it but without effect
XmlWriter writer = XmlWriter.Create(StringWriter, settings);
XmlSerializerNamespaces namespaces = new XmlSerializerNamespaces();
namespaces.Add(string.Empty, string.Empty);
XmlSerializer MySerializer= new XmlSerializer(typeof(MyObject ));
MyObject myObject = new MyObject { Name = "Vladimir", Location = "Moskov" };
MySerializer.Serialize(writer, myObject, namespaces);
string s …Run Code Online (Sandbox Code Playgroud) 我想在后台运行一个线程,它将以给定的时间间隔检查与某个服务器的连接.例如每5秒.
我不知道这是否有一个好的"设计模式"?如果我记得正确的话,我已经读过一些在其执行方法中睡眠线程不好的地方.但我可能错了.
另外,我可以使用普通的TThread类或OTL线程库.
有任何想法吗?
谢谢.
我正在努力奋斗几个小时,无法找到解决通信问题的方法.我的服务需要通过SOAP或纯XML与客户进行通信
我的服务将基于WCF框架编写,但我的客户不是.
您能否一步一步地向我展示如何以返回SOAP或XML消息的方式更改我的服务代码和配置?我对这两种解决方案都感兴趣.
我试图在这个答案的基础上实现这一点:
WCF服务的REST/SOAP端点 使用SOAP调用调用WCF
但是这个解决方案都没有适合我.要么我的浏览器没有任何内容,要么无法找到资源.
所以我开始了一个新的WCF服务项目.它在http:// localhost:3151 /下运行,代码如下:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.Text;
namespace WcfService1
{
// NOTE: If you change the class name "Service1" here, you must also update the reference to "Service1" in Web.config and in the associated .svc file.
public class Service1 : IService1
{
public string GetData(int value)
{
return string.Format("You entered: {0}", value);
}
public CompositeType GetDataUsingDataContract(CompositeType composite)
{
if (composite.BoolValue)
{
composite.StringValue += …Run Code Online (Sandbox Code Playgroud) 可能有人给我解释一下是什么原因,创建一个泛型类时,我必须把我的私人的constans的接口部分?这是在扼杀我的设计,我不希望别人看到应该是私密的东西.
unit Unit38;
interface
uses
Generics.Collections;
type
TSimpleClass<T> = class(TObject)
private
procedure DoSomethingInternal(const SomeString: string);
public
procedure DoSomething;
end;
implementation
const
MyString = 'some string'; //Why this must be public?
{ TSimpleClass<T> }
procedure TSimpleClass<T>.DoSomething;
begin
DoSomethingInternal(MyString); //Compiler error
end;
procedure TSimpleClass<T>.DoSomethingInternal(const SomeString: string);
begin
//-------
end;
end.
Run Code Online (Sandbox Code Playgroud)
谢谢.
我正在尝试将我的代码从Delphi 2007移植到Delphi XE(尚未更新1).我偶然发现的问题是,在Delphi XE下,我在发送第二条GET消息后得到了与服务器不同的响应.
格式化HTML中的消息表明我的会话已过期.但是,直到今天,相同的代码在Delphi 2007下仍然没有任何问题.我通过互联网搜索信息,发现我应该使用CookieManager?
问题是我在Delphi 2007中没有使用任何东西,当我在Delphi XE中分配一个时,我的代码的结果没有改变.我仍然收到有关过期会话的消息.
我还能尝试什么?
更新:我发现一些信息,Indy 10有cookie问题,但它们已修复.
我已经下载了快照Indy10_4722,遗憾的是错误仍然存在.
更新2 - 提供的代码
所以,我准备了一个示例代码.这与Delphi(2007和XE)兼容.但是要在2007年编译它,你需要有GraphicEx库.
代码连接到真实服务器,加载安全映像并在表单中显示它.将图像中的字母重写到编辑框并关闭表单.这就是测试它所需要做的所有事情.
program IndyTest;
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Contnrs, Menus, ExtCtrls, IdBaseComponent,
IdComponent, IdTCPConnection, IdTCPClient, IdHTTP,
{$IFDEF VER220}PngImage{$ELSE}GraphicEx{$ENDIF}, StrUtils;
{$R *.res}
procedure LoadSecurityImage(AImage: TImage; AIdHTTP: TIdHTTP; AImgLink: String);
var
PNGGraphic: {$IFDEF VER220}TPngImage{$ELSE} TPNGGraphic{$ENDIF};
ResponseStream: TMemoryStream;
begin
ResponseStream := TMemoryStream.Create;
PNGGraphic := {$IFDEF VER220}TPngImage.Create{$ELSE}TPNGGraphic.Create{$ENDIF};
try
AIdHTTP.Get(AImgLink, ResponseStream);
ResponseStream.Position := 0;
PNGGraphic.LoadFromStream(ResponseStream);
AImage.Picture.Assign(PNGGraphic);
finally
ResponseStream.Free;
PNGGraphic.Free; …Run Code Online (Sandbox Code Playgroud) 你能帮我理解在Win32平台上我的Delphi应用程序中FPU Control Word的运行情况.
当我们创建一个新的VCL应用程序时,控制字设置为1372h.这是我不明白的第一件事,为什么它是1372h而不是1332h,这是Default8087CW在System单位中定义的.
这两者之间的区别:
1001101110010 //1372h
1001100110010 //1332h
Run Code Online (Sandbox Code Playgroud)
是根据文档保留或不使用的第6位.
第二个问题是CreateOleObject.
function CreateOleObject(const ClassName: string): IDispatch;
var
ClassID: TCLSID;
begin
try
ClassID := ProgIDToClassID(ClassName);
{$IFDEF CPUX86}
try
Set8087CW( Default8087CW or $08);
{$ENDIF CPUX86}
OleCheck(CoCreateInstance(ClassID, nil, CLSCTX_INPROC_SERVER or
CLSCTX_LOCAL_SERVER, IDispatch, Result));
{$IFDEF CPUX86}
finally
Reset8087CW;
end;
{$ENDIF CPUX86}
except
on E: EOleSysError do
raise EOleSysError.Create(Format('%s, ProgID: "%s"',[E.Message, ClassName]),E.ErrorCode,0) { Do not localize }
end;
end;
Run Code Online (Sandbox Code Playgroud)
上面的功能是将控制字改为137Ah,所以它打开第3位(溢出掩码).我不明白为什么要调用它Reset8087CW,而不是恢复进入函数之前的单词状态?
delphi ×6
delphi-2009 ×3
2d ×1
assembly ×1
basm ×1
c# ×1
c++ ×1
com ×1
delphi-2007 ×1
delphi-xe ×1
fastmm ×1
fpu ×1
generator ×1
generics ×1
indy ×1
memory-leaks ×1
oop ×1
optimization ×1
pimpl-idiom ×1
port ×1
soap ×1
terrain ×1
tthread ×1
wcf ×1
web-services ×1
x86 ×1
xml ×1
xmlwriter ×1