Pregunta

Mientras lee sobre la función InterlockedIncrement Vi el comentario de que la variable pasada debe alinearse en un límite de 32 bits. Normalmente he visto el código que utiliza el Encierro de bloqueo como este:

class A
{
 public:
   A();
   void f();

 private:
  volatile long m_count;
};

A::A() : m_count(0)
{
}

void A::f()
{
  ::InterlockedIncrement(&m_count);
}

¿El código anterior funciona correctamente en los sistemas con multiprocesadores o debería tener más cuidado con esto?

¿Fue útil?

Solución

Depende de la configuración de tu compilador. Sin embargo, de forma predeterminada, cualquier cosa de ocho bytes o menos se alineará en un límite natural. Por lo tanto, un " int " Estaremos alineados en un límite de 32 bits.

También, el " #pragma pack " La directiva se puede utilizar para cambiar la alineación dentro de una unidad de compilación.

Me gustaría agregar que la respuesta asume el compilador Microsoft C / C ++. Las reglas de embalaje pueden diferir de compilador a compilador. Pero en general, asumiría que la mayoría de los compiladores de C / C ++ para Windows usan los mismos valores predeterminados de empaquetado solo para facilitar el trabajo con los encabezados de Microsoft SDK.

Otros consejos

El código se ve bien (las variables se alinearán correctamente a menos que hagas algo específicamente para romper eso, que generalmente involucra estructuras de "empaquetado" o "empaquetado").

Sí, esto funcionará bien. Los compiladores generalmente se alinean a menos que se indique lo contrario.

Estrictamente hablando, realmente depende de su uso de A, por ejemplo, si empaqueta un " A " objeto dentro de una shell ITEMIDLIST, o una estructura con un mal paquete de pragma " " los datos pueden no estar correctamente alineados.

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