<?xml version='1.0' encoding="utf-8"?>
      <rss version='2.0'>
      <channel>
      <title>Форум на Исходниках.RU</title>
      <link>https://forum.sources.ru</link>
      <description>Форум на Исходниках.RU</description>
      <generator>Форум на Исходниках.RU</generator>
  	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=427562&amp;view=findpost&amp;p=3866702</guid>
        <pubDate>Sat, 28 May 2022 13:12:54 +0000</pubDate>
        <title>Где размещен объект?</title>
        <link>https://forum.sources.ru/index.php?showtopic=427562&amp;view=findpost&amp;p=3866702</link>
        <description><![CDATA[Majestio: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=427562&view=findpost&p=3866692'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Dushevny &#064; <time class="tag-quote__quoted-time" datetime="2022-05-28T09:42:53+03:00">28.05.22, 06:42</time></span><div class='quote '>Напрямую - никак. Конструктор вызывается после выделения памяти и никакой информации об области размещения не получает</div></div><br>
Да, похоже тут тупичок.<br>
<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=427562&view=findpost&p=3866692'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Dushevny &#064; <time class="tag-quote__quoted-time" datetime="2022-05-28T06:42:53+00:00">28.05.22, 06:42</time></span><div class='quote '>Единственный, на мой взгляд, вариант решения - сделать конструктор защищенным (protected) и создавать объекты через фабрику, которая передаст в конструктор нужный параметр без косяков.</div></div><br>
Я попробовал вот какой вариант, естественно костыльный и непереносимый. Но, думаю, если писать под конкретную реализацию - как-то можно допилить. <strong class='tag-b'>Это для GCC 12.1 x86_64</strong>:<br>
<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">#include &#60;iostream&#62;</div><div class="code_line">&nbsp;</div><div class="code_line">class Base {</div><div class="code_line">&nbsp;&nbsp; &nbsp;uint64_t sp;</div><div class="code_line">&nbsp;&nbsp;public:</div><div class="code_line">&nbsp;&nbsp; &nbsp;Base() {};</div><div class="code_line">&nbsp;&nbsp; &nbsp;void Print(){</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; asm(&quot;mov %%rsp, %0&quot; : &quot;=rm&quot; ( sp )); &nbsp; &nbsp; &nbsp; &nbsp; </div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; std::cout &#60;&#60; this &#60;&#60; std::endl;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; std::cout &#60;&#60; &quot;0x&quot; &#60;&#60; std::hex &#60;&#60; sp &#60;&#60; std::endl;</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">};</div><div class="code_line">&nbsp;</div><div class="code_line">int main() {</div><div class="code_line">&nbsp;&nbsp;Base S1;</div><div class="code_line">&nbsp;&nbsp;Base *H1 = new Base();</div><div class="code_line">&nbsp;&nbsp;S1.Print();</div><div class="code_line">&nbsp;&nbsp;H1-&#62;Print();</div><div class="code_line">}</div></ol></div></div></div></div><script>preloadCodeButtons('1');</script><br>
Выводит интересные цифры:<br>
<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">0x7ffe4345c4a0</div><div class="code_line">0x7ffe4345c480</div><div class="code_line">0xf04eb0</div><div class="code_line">0x7ffe4345c480</div></ol></div></div></div></div>]]></description>
        <author>Majestio</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=427562&amp;view=findpost&amp;p=3866692</guid>
        <pubDate>Sat, 28 May 2022 06:42:53 +0000</pubDate>
        <title>Где размещен объект?</title>
        <link>https://forum.sources.ru/index.php?showtopic=427562&amp;view=findpost&amp;p=3866692</link>
        <description><![CDATA[Dushevny: Напрямую - никак. Конструктор вызывается после выделения памяти и никакой информации об области размещения не получает. Единственный, на мой взгляд, вариант решения - сделать конструктор защищенным (protected) и создавать объекты через фабрику, которая передаст в конструктор нужный параметр без косяков.]]></description>
        <author>Dushevny</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=427562&amp;view=findpost&amp;p=3866690</guid>
        <pubDate>Sat, 28 May 2022 04:20:45 +0000</pubDate>
        <title>Где размещен объект?</title>
        <link>https://forum.sources.ru/index.php?showtopic=427562&amp;view=findpost&amp;p=3866690</link>
        <description><![CDATA[Majestio: Всем привет&#33;<br>
<br>
Задумался какую информацию о себе может хранить/показывать созданный объект. <br>
Вот, к примеру, синтетический код, который позволяет в объекте хранить порядковый номер размещения объекта:<br>
<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">#include &#60;iostream&#62;</div><div class="code_line">#include &#60;cstddef&#62;</div><div class="code_line">&nbsp;</div><div class="code_line">class Base {</div><div class="code_line">&nbsp;&nbsp; &nbsp;inline static std::size_t Counter;</div><div class="code_line">&nbsp;&nbsp; &nbsp;std::size_t Num;</div><div class="code_line">&nbsp;&nbsp;public:</div><div class="code_line">&nbsp;&nbsp; &nbsp;Base() {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;Num = Counter;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;Counter++;</div><div class="code_line">&nbsp;&nbsp; &nbsp;};</div><div class="code_line">&nbsp;&nbsp; &nbsp;std::size_t GetNum() {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;return Num;</div><div class="code_line">&nbsp;&nbsp; &nbsp;};</div><div class="code_line">&nbsp;&nbsp; &nbsp;std::string Where() {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;return &quot;Placed in: &quot;; // ??????????????????????????</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">};</div><div class="code_line">&nbsp;</div><div class="code_line">class Derived: public Base {};</div><div class="code_line">&nbsp;</div><div class="code_line">int main() {</div><div class="code_line">&nbsp;&nbsp;Base S1;</div><div class="code_line">&nbsp;&nbsp;Base S2;</div><div class="code_line">&nbsp;&nbsp;Derived *H1 = new Derived();</div><div class="code_line">&nbsp;&nbsp;std::cout &#60;&#60; &quot;S1: &quot; &#60;&#60; S1.GetNum() &#60;&#60; std::endl;</div><div class="code_line">&nbsp;&nbsp;std::cout &#60;&#60; &quot;S2: &quot; &#60;&#60; S2.GetNum() &#60;&#60; std::endl;</div><div class="code_line">&nbsp;&nbsp;std::cout &#60;&#60; &quot;H1: &quot; &#60;&#60; H1-&#62;GetNum() &#60;&#60; std::endl;</div><div class="code_line">}</div></ol></div></div></div></div><br>
Вывод даст:<br>
<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">S1: 0</div><div class="code_line">S2: 1</div><div class="code_line">H1: 2</div></ol></div></div></div></div><br>
Естественно, тут все просто, обычная работа со статической переменной. <br>
<br>
А вот сам вопрос темы сложнее - <strong class='tag-b'>как в объекте можно узнать где он разместился</strong>?<br>
Оставлять в конструкторе какой-то параметр, указывающий тип размещения - не варик, можно накосячить.]]></description>
        <author>Majestio</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      </channel>
      </rss>
	