Войти
|
Присоединиться
CodePaste.ru
# My code sucks but I don't give a fuck
CodePaste.ru # My code sucks but I don't give a fuck
Главная
Все исходники
Добавить
md5
base64
url
diff
Singletone
(C++)
Добавил:
pshenichny
Автор:
pshenichny
text/plain
text/html
source
Old rev.:
<span style="color: #339900;">#include <stdio.h></span><br /> <span style="color: #339900;">#include <windows.h></span><br /> <br /> <br /> <span style="color: #0000ff;">class</span> Simple<br /> <span style="color: #008000;">{</span><br /> <span style="color: #0000ff;">public</span><span style="color: #008080;">:</span><br /> Simple <span style="color: #008000;">(</span><span style="color: #008000;">)</span><br /> <span style="color: #008000;">{</span><br /> a <span style="color: #000080;">=</span> <span style="color: #0000dd;">5</span><span style="color: #008080;">;</span><br /> <span style="color: #008000;">}</span><br /> <br /> ~Simple <span style="color: #008000;">(</span><span style="color: #008000;">)</span><br /> <span style="color: #008000;">{</span><br /> a <span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span><br /> <span style="color: #008000;">}</span><br /> <br /> <span style="color: #0000ff;">int</span> Get <span style="color: #008000;">(</span><span style="color: #008000;">)</span> <span style="color: #0000ff;">const</span><br /> <span style="color: #008000;">{</span><br /> <span style="color: #0000ff;">return</span> a<span style="color: #008080;">;</span><br /> <span style="color: #008000;">}</span><br /> <br /> <span style="color: #0000ff;">private</span><span style="color: #008080;">:</span><br /> <span style="color: #0000ff;">int</span> a<span style="color: #008080;">;</span><br /> <span style="color: #008000;">}</span><span style="color: #008080;">;</span><br /> <br /> <br /> Simple simple<span style="color: #008080;">;</span><br /> <br /> <br /> <span style="color: #666666;">// Небезопасный синглтон</span><br /> __forceinline Simple <span style="color: #000040;">&</span> Instance <span style="color: #008000;">(</span><span style="color: #008000;">)</span><br /> <span style="color: #008000;">{</span><br /> <span style="color: #0000ff;">static</span> Simple one<span style="color: #008080;">;</span><br /> <span style="color: #0000ff;">return</span> one<span style="color: #008080;">;</span><br /> <span style="color: #008000;">}</span><br /> <br /> <br /> CRITICAL_SECTION critical_section<span style="color: #008080;">;</span><br /> <br /> <span style="color: #666666;">// Безопасный синглтон</span><br /> __forceinline Simple <span style="color: #000040;">&</span> SafeInstance <span style="color: #008000;">(</span><span style="color: #008000;">)</span><br /> <span style="color: #008000;">{</span><br /> EnterCriticalSection <span style="color: #008000;">(</span> <span style="color: #000040;">&</span> critical_section <span style="color: #008000;">)</span><span style="color: #008080;">;</span><br /> <span style="color: #0000ff;">static</span> Simple one<span style="color: #008080;">;</span><br /> LeaveCriticalSection <span style="color: #008000;">(</span> <span style="color: #000040;">&</span> critical_section <span style="color: #008000;">)</span><span style="color: #008080;">;</span><br /> <br /> <span style="color: #0000ff;">return</span> one<span style="color: #008080;">;</span><br /> <span style="color: #008000;">}</span><br /> <br /> <br /> <br /> <span style="color: #0000ff;">int</span> main <span style="color: #008000;">(</span><span style="color: #008000;">)</span><br /> <span style="color: #008000;">{</span><br /> <span style="color: #0000ff;">if</span> <span style="color: #008000;">(</span> SetPriorityClass <span style="color: #008000;">(</span> GetCurrentProcess <span style="color: #008000;">(</span><span style="color: #008000;">)</span>, REALTIME_PRIORITY_CLASS <span style="color: #008000;">)</span> <span style="color: #000080;">==</span> 0 <span style="color: #008000;">)</span><br /> <span style="color: #008000;">{</span><br /> <span style="color: #0000dd;">printf</span> <span style="color: #008000;">(</span> <span style="color: #FF0000;">"SetPriority failed.<span style="color: #000099; font-weight: bold;">\n</span>"</span><span style="color: #008000;">)</span><span style="color: #008080;">;</span><br /> <span style="color: #008000;">}</span><br /> <br /> InitializeCriticalSection <span style="color: #008000;">(</span> <span style="color: #000040;">&</span> critical_section <span style="color: #008000;">)</span><span style="color: #008080;">;</span><br /> <br /> <span style="color: #0000ff;">const</span> <span style="color: #0000ff;">int</span> LOOP_COUNT <span style="color: #000080;">=</span> <span style="color: #0000dd;">20000000</span><span style="color: #008080;">;</span><br /> LARGE_INTEGER t1, t2, t3, t4, t_per_sec<span style="color: #008080;">;</span><br /> <span style="color: #0000ff;">volatile</span> <span style="color: #0000ff;">int</span> k<span style="color: #008080;">;</span><br /> <br /> <span style="color: #666666;">// обычный доступ</span><br /> QueryPerformanceCounter <span style="color: #008000;">(</span> <span style="color: #000040;">&</span> t1 <span style="color: #008000;">)</span><span style="color: #008080;">;</span><br /> <span style="color: #0000ff;">for</span> <span style="color: #008000;">(</span> <span style="color: #0000ff;">int</span> i <span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span> i <span style="color: #000080;"><</span> LOOP_COUNT<span style="color: #008080;">;</span> <span style="color: #000040;">++</span>i <span style="color: #008000;">)</span><br /> <span style="color: #008000;">{</span><br /> k <span style="color: #000080;">=</span> simple.<span style="color: #007788;">Get</span><span style="color: #008000;">(</span><span style="color: #008000;">)</span><span style="color: #008080;">;</span><br /> k <span style="color: #000080;">=</span> simple.<span style="color: #007788;">Get</span><span style="color: #008000;">(</span><span style="color: #008000;">)</span><span style="color: #008080;">;</span><br /> k <span style="color: #000080;">=</span> simple.<span style="color: #007788;">Get</span><span style="color: #008000;">(</span><span style="color: #008000;">)</span><span style="color: #008080;">;</span><br /> k <span style="color: #000080;">=</span> simple.<span style="color: #007788;">Get</span><span style="color: #008000;">(</span><span style="color: #008000;">)</span><span style="color: #008080;">;</span><br /> <span style="color: #008000;">}</span><br /> <br /> <span style="color: #666666;">// доступ через синглтон</span><br /> QueryPerformanceCounter <span style="color: #008000;">(</span> <span style="color: #000040;">&</span> t2 <span style="color: #008000;">)</span><span style="color: #008080;">;</span><br /> <span style="color: #0000ff;">for</span> <span style="color: #008000;">(</span> <span style="color: #0000ff;">int</span> i <span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span> i <span style="color: #000080;"><</span> LOOP_COUNT<span style="color: #008080;">;</span> <span style="color: #000040;">++</span>i <span style="color: #008000;">)</span><br /> <span style="color: #008000;">{</span><br /> k <span style="color: #000080;">=</span> Instance<span style="color: #008000;">(</span><span style="color: #008000;">)</span>.<span style="color: #007788;">Get</span><span style="color: #008000;">(</span><span style="color: #008000;">)</span><span style="color: #008080;">;</span><br /> k <span style="color: #000080;">=</span> Instance<span style="color: #008000;">(</span><span style="color: #008000;">)</span>.<span style="color: #007788;">Get</span><span style="color: #008000;">(</span><span style="color: #008000;">)</span><span style="color: #008080;">;</span><br /> k <span style="color: #000080;">=</span> Instance<span style="color: #008000;">(</span><span style="color: #008000;">)</span>.<span style="color: #007788;">Get</span><span style="color: #008000;">(</span><span style="color: #008000;">)</span><span style="color: #008080;">;</span><br /> k <span style="color: #000080;">=</span> Instance<span style="color: #008000;">(</span><span style="color: #008000;">)</span>.<span style="color: #007788;">Get</span><span style="color: #008000;">(</span><span style="color: #008000;">)</span><span style="color: #008080;">;</span><br /> <span style="color: #008000;">}</span><br /> <br /> <span style="color: #666666;">// доступ через безопасный синглтон</span><br /> QueryPerformanceCounter <span style="color: #008000;">(</span> <span style="color: #000040;">&</span> t3 <span style="color: #008000;">)</span><span style="color: #008080;">;</span><br /> <span style="color: #0000ff;">for</span> <span style="color: #008000;">(</span> <span style="color: #0000ff;">int</span> i <span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span> i <span style="color: #000080;"><</span> LOOP_COUNT<span style="color: #008080;">;</span> <span style="color: #000040;">++</span>i <span style="color: #008000;">)</span><br /> <span style="color: #008000;">{</span><br /> k <span style="color: #000080;">=</span> SafeInstance<span style="color: #008000;">(</span><span style="color: #008000;">)</span>.<span style="color: #007788;">Get</span><span style="color: #008000;">(</span><span style="color: #008000;">)</span><span style="color: #008080;">;</span><br /> k <span style="color: #000080;">=</span> SafeInstance<span style="color: #008000;">(</span><span style="color: #008000;">)</span>.<span style="color: #007788;">Get</span><span style="color: #008000;">(</span><span style="color: #008000;">)</span><span style="color: #008080;">;</span><br /> k <span style="color: #000080;">=</span> SafeInstance<span style="color: #008000;">(</span><span style="color: #008000;">)</span>.<span style="color: #007788;">Get</span><span style="color: #008000;">(</span><span style="color: #008000;">)</span><span style="color: #008080;">;</span><br /> k <span style="color: #000080;">=</span> SafeInstance<span style="color: #008000;">(</span><span style="color: #008000;">)</span>.<span style="color: #007788;">Get</span><span style="color: #008000;">(</span><span style="color: #008000;">)</span><span style="color: #008080;">;</span><br /> <span style="color: #008000;">}</span><br /> <br /> QueryPerformanceCounter <span style="color: #008000;">(</span> <span style="color: #000040;">&</span> t4 <span style="color: #008000;">)</span><span style="color: #008080;">;</span><br /> QueryPerformanceFrequency <span style="color: #008000;">(</span> <span style="color: #000040;">&</span> t_per_sec <span style="color: #008000;">)</span><span style="color: #008080;">;</span><br /> <br /> DeleteCriticalSection <span style="color: #008000;">(</span> <span style="color: #000040;">&</span> critical_section <span style="color: #008000;">)</span><span style="color: #008080;">;</span><br /> <br /> <span style="color: #0000dd;">printf</span> <span style="color: #008000;">(</span> <span style="color: #FF0000;">" simple.Get() = %I64u msec<span style="color: #000099; font-weight: bold;">\n</span>"</span>, 1000 <span style="color: #000040;">*</span> <span style="color: #008000;">(</span>t2.<span style="color: #007788;">QuadPart</span> <span style="color: #000040;">-</span> t1.<span style="color: #007788;">QuadPart</span><span style="color: #008000;">)</span> <span style="color: #000040;">/</span> t_per_sec.<span style="color: #007788;">QuadPart</span> <span style="color: #008000;">)</span><span style="color: #008080;">;</span><br /> <span style="color: #0000dd;">printf</span> <span style="color: #008000;">(</span> <span style="color: #FF0000;">" Instance().Get() = %I64u msec<span style="color: #000099; font-weight: bold;">\n</span>"</span>, 1000 <span style="color: #000040;">*</span> <span style="color: #008000;">(</span>t3.<span style="color: #007788;">QuadPart</span> <span style="color: #000040;">-</span> t2.<span style="color: #007788;">QuadPart</span><span style="color: #008000;">)</span> <span style="color: #000040;">/</span> t_per_sec.<span style="color: #007788;">QuadPart</span> <span style="color: #008000;">)</span><span style="color: #008080;">;</span><br /> <span style="color: #0000dd;">printf</span> <span style="color: #008000;">(</span> <span style="color: #FF0000;">"SafeInstance().Get() = %I64u msec<span style="color: #000099; font-weight: bold;">\n</span>"</span>, 1000 <span style="color: #000040;">*</span> <span style="color: #008000;">(</span>t4.<span style="color: #007788;">QuadPart</span> <span style="color: #000040;">-</span> t3.<span style="color: #007788;">QuadPart</span><span style="color: #008000;">)</span> <span style="color: #000040;">/</span> t_per_sec.<span style="color: #007788;">QuadPart</span> <span style="color: #008000;">)</span><span style="color: #008080;">;</span><br /> <br /> <span style="color: #0000ff;">return</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span><br /> <span style="color: #008000;">}</span><br />