Pregunta

Estoy utilizando el IDE de Delphi 7. ¿El compilador de Delphi códigos Optimizar, al igual que lo que el compilador de C ++ está haciendo en el siguiente enlace?

http://msdn.microsoft.com/en -US / library / aa366877 (VS.85) .aspx

WCHAR szPassword[MAX_PATH];
// Retrieve the password
if (GetPasswordFromUser(szPassword, MAX_PATH))    
   UsePassword(szPassword);
// Clear the password from memory
SecureZeroMemory(szPassword, sizeof(szPassword));

Si ZeroMemory se llama en este ejemplo en lugar de SecureZeroMemory, el compilador podría optimizar la llamada porque el búfer szPassword no se lee desde antes de que se sale del ámbito. La contraseña se mantendría en la pila de aplicaciones en el que podría ser capturado en un volcado de bloqueo o sondeó por una aplicación maliciosa.

¿Fue útil?

Solución

Sí, por supuesto Delphi realiza optimizaciones. Sin embargo, no lleva a cabo la optimización de que la función SecureZeroMemory tiene la intención de eludir. No hay necesidad de usar esa función en Delphi; sólo tiene que utilizar ZeroMemory a secas, o incluso FillChar. No son las macros, y ellos no hacen nada que Delphi reconoce como instrucciones de asignación no utilizados que podrían quedar fuera optimizados.

Otros consejos

Delphi optimización de código realiza de forma predeterminada, puede desactivarlo en Proyecto> Opciones> compilador .

La ayuda de Delphi proporcionan algunos consejos de qué tipo de optimizaciones se utilizan:

  

La optimización de código $ S directiva controla. En el estado {$ O +}, los realiza el compilador un número de optimizaciones de código, tales como la colocación de las variables en registros de la CPU, la eliminación de subexpresiones comunes, y la generación de variables de inducción.

También se establece que "el compilador realiza optimizaciones 'no' inseguros" , pero en el sentido de que no van a alterar la ruta de ejecución, no desde un punto de vista de seguridad.

No creo que el compilador nunca eliminar código aparentemente muerto de esta manera. Nunca he tenido problemas de ajuste puntos de interrupción en el código que podría haber sido eliminados por redundante.

En algunos escenarios, el compilador puede detectar si el código es inalcanzable y eliminar el código.

Por ejemplo, el compilador elimina correctamente la parte de "inalcanzable" del código de abajo.
No va a generar código para esa línea de modo:

  1. Así que no hay balas azules que indican que hay código
  2. Los puntos de interrupción puso en esa línea estará marcado visualmente como 'no alcanzable'

Sólo probado en Delphi XE, pero las versiones anteriores de Delphi tienen un comportamiento similar.

program Project1;

{$APPTYPE CONSOLE}

uses
  SysUtils;

procedure Test;
begin
  if (True = False) then
    Writeln('Unreachable')
  else
    Writeln('Reachable');
end;

begin
  try
    Test();
  except
    on E: Exception do
      Writeln(E.ClassName, ': ', E.Message);
  end;
end.

Se necesita bastante tiempo para saber cuándo (o cuando no) el optimizador en los tiros de nivel de código y nivel de Liker.

Por ejemplo: Cuando se tiene optimizaciones encendidos, el compilador también eliminar las variables en cuanto no se utilizan
. A veces, incluso elimina los símbolos globales. Danny Thorpe (ex ingeniero de Delphi compilador y Director Científico) una vez escribió un método mágico táctil que lo impide.
Sólo tiene que llamar este método táctil al final de su método para engañar el optimizador durante la depuración:

procedure Touch(var arg);
begin
end;

- Jeroen

Delphi sin duda optimiza código (que es un moderno y excelente, compilador). Otro ejemplo de optimización de líneas de eliminación se aplican:

SomeFunction();  // Set breakpoint here, then step (F10)
myInt := 7;      // Next line will not hit this...
myInt := 13;     // ...but will instead skip to here

Me gusta para asegurar la optimización está en el estado correcto (y no dejó accidentalmente encendido o apagado) mediante la adición de {$I MyProjectOptions.inc} en todos los archivos .pas en mi proyecto. Esto va justo debajo del nombre de la unidad (a la derecha en la parte superior del archivo). En "MyProjectOptions.inc" sólo tiene que añadir este código:

// Is this a debug or non-debug build?
{$IF Defined(DEBUG)}
    {$O-}   // Turn optimization off
{$ELSEIF Defined(NDEBUG)}
    {$O+}   // Ensure optimisation is on
{$IFEND}
sección del Proyecto> Opciones> Diectories / Condicionales

Por último, asegúrese de que ha definido "debug" y "NDEBUG" (o su equivalente en las versiones anteriores de Delphi) en el condicional define.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top