Domanda

Durante la lettura della funzione InterlockedIncrement Ho visto l'osservazione che la variabile passata deve essere allineata su un limite di 32 bit. Normalmente ho visto il codice che utilizza InterlockedIncrement in questo modo:

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

 private:
  volatile long m_count;
};

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

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

Il codice sopra riportato funziona correttamente nei sistemi multiprocessore o dovrei occuparmene un po 'di più?

È stato utile?

Soluzione

Dipende dalle impostazioni del compilatore. Tuttavia, per impostazione predefinita, qualsiasi valore di almeno 8 byte verrà allineato su un limite naturale. Quindi un "int" siamo allineati su un limite di 32 bit.

Inoltre, il pacchetto " #pragma " la direttiva può essere utilizzata per modificare l'allineamento all'interno di un'unità di compilazione.

Vorrei aggiungere che la risposta presuppone un compilatore Microsoft C / C ++. Le regole di imballaggio potrebbero differire da compilatore a compilatore. Ma in generale, presumo che la maggior parte dei compilatori C / C ++ per Windows utilizzino le stesse impostazioni predefinite di impacchettamento solo per rendere un po 'più semplice lavorare con le intestazioni di Microsoft SDK.

Altri suggerimenti

Il codice sembra a posto (le variabili saranno allineate correttamente a meno che tu non faccia qualcosa di specifico per romperlo, di solito coinvolgendo il cast o le strutture "impacchettate").

Sì, funzionerà bene. I compilatori di solito si allineano se non diversamente specificato.

A rigor di termini, dipende davvero dal tuo utilizzo di A - ad esempio, se impacchi un " A " oggetto all'interno di un ITEMIDLIST di shell, o una struttura con un "pacchetto pragma" errato; i dati potrebbero non essere allineati correttamente.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top