|
Dieser Artikel wurde maschinell übersetzt. Bewegen Sie den Mauszeiger über die Sätze im Artikel, um den Originaltext anzuzeigen. Weitere Informationen
|
Übersetzung
Original
|
_ReadWriteBarrier
Microsoft-spezifisch
Vorsicht
|
|---|
|
|
void _ReadWriteBarrier(void);
Hinweis
|
|---|
|
|
Betroffener Arbeitsspeicher
-
Die Variable ist eine globale Variable. -
Die Variable ist eine lokale Variable, die in __try, __except oder __finally-Block verwendet wird, wenn die strukturierte Ausnahmebehandlung verwendet wird, oder ein catch-Block, wenn die C++-Ausnahmebehandlung verwendet wird. Weitere Informationen finden Sie in der /EHa-Compileroption. -
Die Variable ist eine lokale Variable, die volatile deklariert ist. -
Die Variable ist eine lokale Variable, deren Adresse die aktuelle Funktion auf eine Weise versieht. Beispielsweise wird die Variable mit Hinweis auf eine andere Funktion übergeben oder seine Adresse wird einer globalen Variablen zugewiesen. -
Die Variable wird indirekt über einen Zeiger darauf zugegriffen, und der dereferenzierte Zeiger erfüllt eine der vorherigen Bedingungen. Der gängigste Fall ist *p, in dem p eine globale Variable oder einen Parameter handelt.
// intrinsics_readwritebarrier.c
// compile with: /O2 -DNO_BARRIER
// This code contains an error--dereferencing a null pointer--
// which will be optimized away as a useless assignment.
// Omit the NO_BARRIER command line to activate the Write Barrier.
// With the barrier activated, the assignment is not optimized away
// and causes an access violation.
#include <windows.h> // for EXCEPTION_ACCESS_VIOLATION
#include <excpt.h>
#include <stdio.h>
#include <intrin.h>
#pragma intrinsic(_ReadWriteBarrier)
int x = 0;
__declspec(noinline) int f(int* p)
{
x = *p;
#ifndef NO_BARRIER
_ReadWriteBarrier();
#endif
x = 7;
return x;
}
// If code is EXCEPTION_ACCESS_VIOLATION it means an
// attempt to read from the NULL pointer we passed in, so
// we handle the exception.
int filter(unsigned int code, struct _EXCEPTION_POINTERS *ep)
{
if (code == EXCEPTION_ACCESS_VIOLATION)
{
printf_s("AV\n");
return EXCEPTION_EXECUTE_HANDLER;
}
// If not what we were looking for, we don't want to handle it.
return EXCEPTION_CONTINUE_SEARCH;
}
int main()
{
int nRet = 0;
__try
{
// Should return only if the first assignment is
// optimized away.
nRet = f(NULL);
printf_s("Assignment was optimized away!\n");
}
__except(filter(GetExceptionCode(), GetExceptionInformation()))
{
// We get here if an Access violation occurred.
printf_s("Access Violation: assignment was not optimized away.\n");
}
}
Zuweisung ausgelassen wurde optimiert!
Vorsicht