小编Wod*_*dzu的帖子

pImpl成语是否真的在实践中使用?

我正在阅读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)

这看起来很有趣,但我以前从未见过这种方法,既没有在我工作的公司,也没有在我看过源代码的开源项目中.所以,我想知道这种技术真的在实践中使用了吗?

我应该在任何地方使用它,还是谨慎使用?这种技术是否建议用于嵌入式系统(性能非常重要)?

c++ oop pimpl-idiom

157
推荐指数
7
解决办法
3万
查看次数

有没有办法以编程方式判断FastMM是否没有释放特定的内存块?

我试图检测是否释放了一块内存.当然,经理告诉我通过对话框或日志文件,但如果我想将结果存储在数据库中该怎么办?例如,我想在数据库表中包含分配给定块的例程的名称.

在阅读了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 memory-leaks delphi-2009 fastmm

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

英特尔x86汇编优化技术中的示例问题

我正在学习汇编程序很长一段时间,我正在尝试重写一些简单的过程\函数来查看性能优势(如果有的话).我的主要开发工具是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)

下面我介绍解决问题的五种方法.接下来,我将展示他们的时间比较以及我如何衡量这些时间.

我的问题包括两部分:

1.

我问您详细的有关方法的答案DecodePixels4aDecodePixels4b.为什么方法4b有点慢4a

例如,如果我的代码没有正确对齐,它会慢一些,那么告诉我给定方法中哪些指令可以更好地对齐,以及如何做到这一点不破坏方法.

我想看看这个理论背后的真实例子.请记住,我正在学习汇编,我想从你的答案中获得知识,这使我将来能够编写更好的优化代码.

2.

你能写更快的常规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)

delphi optimization x86 assembly basm

21
推荐指数
3
解决办法
3835
查看次数

逼真的2D地形图生成

我正在寻找一些允许我生成逼真的2D地形图的算法.通过现实我的意思是,这个人会将这样的地图视为"普通"地形图,而不是人工创建的.我不想创建逼真的地图.只是类似于可以在地理地图集中查看的地图.

到目前为止,我正在使用perlin噪音进行高度测绘,然后我会添加湖泊,河流,山脉,沼泽等.您可以在下面的图片中查看它的外观:

地形图http://www.freeimagehosting.net/uploads/1f1e9372bf.png

我对它不满意.这是不现实的,但我不能自己找出更好的东西.时间不是问题所以算法可能是繁重的计算.

谢谢你的时间.

编辑后:

我想我找到了一篇可以提供帮助的文章:http://portal.acm.org/citation.cfm?id = 1255047.1255077

然而,它不能免费获得,所以我仍然在寻找答案或想法.

2d generator terrain

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

将对象序列化为xml和字符串,不带\ r \n特殊字符

我想将我的对象序列化为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)

c# xmlwriter xml-serialization

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

如何实现使用最少资源定期检查某些内容的线程?

我想在后台运行一个线程,它将以给定的时间间隔检查与某个服务器的连接.例如每5秒.

我不知道这是否有一个好的"设计模式"?如果我记得正确的话,我已经读过一些在其执行方法中睡眠线程不好的地方.但我可能错了.

另外,我可以使用普通的TThread类或OTL线程库.

有任何想法吗?

谢谢.

delphi multithreading tthread delphi-2009 omnithreadlibrary

13
推荐指数
2
解决办法
2476
查看次数

WCF服务,SOAP或纯XML中的响应,如何?

我正在努力奋斗几个小时,无法找到解决通信问题的方法.我的服务需要通过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)

xml wcf soap web-services

11
推荐指数
1
解决办法
3万
查看次数

E2506接口部分中声明的参数化类型的方法不得使用本地符号

可能有人给我解释一下是什么原因,创建一个泛型类时,我必须把我的私人的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 generics compiler-errors delphi-2009

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

TIdHTTP - 会话已在Delphi XE下过期消息

我正在尝试将我的代码从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)

delphi port indy delphi-2007 delphi-xe

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

为什么应用程序以与Default8087CW不同的FPU控制字启动?

你能帮我理解在Win32平台上我的Delphi应用程序中FPU Control Word的运行情况.

当我们创建一个新的VCL应用程序时,控制字设置为1372h.这是我不明白的第一件事,为什么它是1372h而不是1332h,这是Default8087CWSystem单位中定义的.

这两者之间的区别:

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 com fpu delphi-10.1-berlin

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