Pergunta

Ao ler sobre a função InterlockedIncrement Eu vi a observação de que a variável passada deve ser alinhado em um limite de 32 bits. Normalmente eu vi o código que utiliza a InterlockedIncrement assim:

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

 private:
  volatile long m_count;
};

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

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

Será que o trabalho de código acima corretamente em sistemas multi-processador ou devo levar mais alguns cuidados para isso?

Foi útil?

Solução

Tudo depende das suas configurações do compilador. No entanto, por padrão, qualquer coisa oito bytes e sob será alinhado em um limite natural. Assim, um "int" que ser alinhado em um limite de 32 bits.

Além disso, a directiva "pragma pacote" pode ser usado para o alinhamento mudança dentro de uma unidade de compilação.

Gostaria de acrescentar que a resposta assume compilador Microsoft C / C ++. regras de embalagem pode ser diferente do compilador para compilador. Mas, em geral, gostaria de assumem que a maioria dos C / C ++ compiladores para Windows usam os mesmos padrões de embalagem apenas para tornar o trabalho com cabeçalhos Microsoft SDK um pouco mais fácil.

Outras dicas

A aparência de código fina (variáveis ??serão devidamente alinhados, a menos que especificamente fazer algo para quebrar isso - geralmente envolvendo vazamento ou 'embalado' estruturas).

Sim, isso vai funcionar bem. Compiladores costumam fazer alinhar salvo ordem em contrário.

A rigor, ele realmente depende do seu uso de A - por exemplo, se você arrumar um objeto "A" dentro de um ITEMIDLIST shell, ou um struct com um mau "pragma pacote" os dados não podem ser devidamente alinhados <. / p>

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top