<?xml version="1.0" encoding="koi8-r"?>
<rss version="0.91">
<channel>
    <title>OpenForum RSS: копирование структуры в функциях С</title>
    <link>https://www.opennet.me/openforum/vsluhforumID9/7528.html</link>
    <description>Здравствуйте. Вопрос по С. Допустим, есть структура на 32битной машине &lt;br&gt;typedef struct &#123; short a, b; &#125; t_bi_short;&lt;br&gt;или ее идейные аналоги на 64битной&lt;br&gt;typedef struct &#123; int a, b; &#125; t_bi_int;&lt;br&gt;typedef struct &#123; short a, b, c, d; &#125; t_thetra_short;&lt;br&gt;С такой структурой бывает удобно работать т.к. она имеет размерность регистра и ее можно копировать, передавая в функцию копию данных, а не указатель на них. Но формально язык не поддерживает таких приемов, и приходиться писать что-то типа:&lt;br&gt;void function(int arg);&lt;br&gt;и вызывать как&lt;br&gt;&#123;&lt;br&gt;t_bi_short bi_short;&lt;br&gt;&amp;#8230;..&lt;br&gt;function(*(int*)&amp;bi_short);&lt;br&gt;&#125;&lt;br&gt;&lt;br&gt;Все работает, нo не красиво и сильно страдает читабельность кода. А как сделать идейно правильно?&lt;br&gt;Спасибо.&lt;br&gt;</description>

<item>
    <title>копирование структуры в функциях С (ghost_in_machine)</title>
    <link>https://www.opennet.me/openforum/vsluhforumID9/7528.html#4</link>
    <pubDate>Thu, 07 Aug 2008 07:14:48 GMT</pubDate>
    <description>&amp;gt;&#091;оверквотинг удален&#093;&lt;br&gt;&amp;gt;v из RDI. &lt;br&gt;&amp;gt;Под i386 хуже: обе функции берут параметры со стека и от этого &lt;br&gt;&amp;gt;никуда не деться без ассемблера (да и с ним трудновато). К &lt;br&gt;&amp;gt;тому же, f1 кладёт результат обратно в стек, и это опять &lt;br&gt;&amp;gt;же протокол вызова функций (другими словами, c&apos;est la vie). &lt;br&gt;&amp;gt;А на какой-нибудь ещё суровой машине вполне может оказаться sizeof(struct val) &amp;gt; 4 * sizeof(short) и весь разговор не будет иметь никакого смысла.&lt;br&gt;&amp;gt;&lt;br&gt;&amp;gt;Если функции, которые вы пытаетесь оптимизировать, маленькие, то напишите их реализацию в &lt;br&gt;&amp;gt;хедере: от inline толку больше, чем от таких сомнительных фокусов. А &lt;br&gt;&amp;gt;если функции большие, то игра не стоит свеч. &lt;br&gt;&lt;br&gt;Спасибо за ответ.&lt;br&gt;Amd64 является целевой платформой для моего проекта.&lt;br&gt;Касательно больших функций, то данные часто надо доставлять к зубодробилке через ряд подготовительных процедур. Соответственно, единообразие их представления облегчает проверку логики алгоритма. Этот факт только увеличивает ценность вашего ответа, СПАСИБО.&lt;br&gt;&lt;br&gt;</description>
</item>

<item>
    <title>копирование структуры в функциях С (const)</title>
    <link>https://www.opennet.me/openforum/vsluhforumID9/7528.html#3</link>
    <pubDate>Wed, 06 Aug 2008 16:27:09 GMT</pubDate>
    <description>struct val &#123; short a, b, c, d; &#125;;&lt;br&gt;struct val f1(short x) &#123; return (struct val)&#123;x, x, x, x&#125;; &#125;&lt;br&gt;short f2(struct val v) &#123; return v.a ^ v.b ^ v.c ^ v.d; &#125;&lt;br&gt;&lt;br&gt;...и аналогично для двух других структур: с двумя интами и с двумя шортами.&lt;br&gt;Под amd64 всё в ажуре: f1 возвращает результат в RAX, f2 достаёт v из RDI.&lt;br&gt;Под i386 хуже: обе функции берут параметры со стека и от этого никуда не деться без ассемблера (да и с ним трудновато). К тому же, f1 кладёт результат обратно в стек, и это опять же протокол вызова функций (другими словами, c&apos;est la vie).&lt;br&gt;А на какой-нибудь ещё суровой машине вполне может оказаться sizeof(struct val) &amp;gt; 4 * sizeof(short) и весь разговор не будет иметь никакого смысла.&lt;br&gt;&lt;br&gt;Если функции, которые вы пытаетесь оптимизировать, маленькие, то напишите их реализацию в хедере: от inline толку больше, чем от таких сомнительных фокусов. А если функции большие, то игра не стоит свеч.&lt;br&gt;</description>
</item>

<item>
    <title>копирование структуры в функциях С (ghost_in_machine)</title>
    <link>https://www.opennet.me/openforum/vsluhforumID9/7528.html#2</link>
    <pubDate>Wed, 06 Aug 2008 13:33:13 GMT</pubDate>
    <description>&amp;gt;&amp;gt;&lt;br&gt;&amp;gt;&amp;gt;А как сделать идейно правильно? &lt;br&gt;&amp;gt;&lt;br&gt;&amp;gt;Идейно правильно - не рассчитывать на размерность вообще. &lt;br&gt;&amp;gt;&lt;br&gt;&amp;gt;Непонятно также, что вы особо выигрываете, передавая в функцию данные, а не &lt;br&gt;&amp;gt;указатель на них. Если эти данные ложатся в стек, то процессору &lt;br&gt;&amp;gt;все равно за ними лезть в память, по адресу в стеке. &lt;br&gt;&amp;gt;Если передаются через регистры - то все равно они туда попадают &lt;br&gt;&amp;gt;из памяти же, при вызове. &lt;br&gt;&lt;br&gt;Спасибо за ответ. &lt;br&gt;Выигрышей несколько:&lt;br&gt;1) если данные надо портить, то их придется в функции явно копировать из указателя,&lt;br&gt;2) часто (особенно на 64 битах) можно выполнить 2 операции одной командой над структурой. Ну, к примеру, сдвигать два индекса массива одновременно простым суммированием, или инициализировать/сравнивать одним равенством/условием. Вероятно компилятор это оптимизирует как-то и без меня, но мне так спокойнее за критические куски кода :),&lt;br&gt;3) функция может возвращать 2 аргумента вместо одного напрямую, а не через аргумент-указатель, да и вообще количество аргументов уменьшаеться.&lt;br&gt;Короче, вы</description>
</item>

<item>
    <title>копирование структуры в функциях С (Michelnok)</title>
    <link>https://www.opennet.me/openforum/vsluhforumID9/7528.html#1</link>
    <pubDate>Wed, 06 Aug 2008 12:57:34 GMT</pubDate>
    <description>&amp;gt;&lt;br&gt;&amp;gt;А как сделать идейно правильно? &lt;br&gt;&lt;br&gt;Идейно правильно - не рассчитывать на размерность вообще.&lt;br&gt;&lt;br&gt;Непонятно также, что вы особо выигрываете, передавая в функцию данные, а не указатель на них. Если эти данные ложатся в стек, то процессору все равно за ними лезть в память, по адресу в стеке. Если передаются через регистры - то все равно они туда попадают из памяти же, при вызове.&lt;br&gt;</description>
</item>

</channel>
</rss>
