<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
    <channel>
        <title>نوشته های قاسم رمضانی‌منش</title>
        <link>https://virgool.io/feed/@another-ghasem</link>
        <description>.Junior Software Engineer at Arad Co</description>
        <language>fa</language>
        <pubDate>2026-04-15 10:27:04</pubDate>
        <image>
            <url>https://files.virgool.io/upload/users/1148137/avatar/4vW0Yr.jpeg?height=120&amp;width=120</url>
            <title>قاسم رمضانی‌منش</title>
            <link>https://virgool.io/@another-ghasem</link>
        </image>

                    <item>
                <title>تفاوت برنامه‌نویس سی و سی‌پلاس‌پلاس</title>
                <link>https://virgool.io/@another-ghasem/%D8%AA%D9%81%D8%A7%D9%88%D8%AA-%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D9%87-%D9%86%D9%88%DB%8C%D8%B3-%D8%B3%DB%8C-%D9%88-%D8%B3%DB%8C-%D9%BE%D9%84%D8%A7%D8%B3-%D9%BE%D9%84%D8%A7%D8%B3-oshxwki5zfbc</link>
                <description>برنامه‌نویس‌های سی، معمولاً بیشتر قسمت‌های برنامه رو خودشون دستی کد می‌زدند (به خاطر محدودیّت‌هایی که توی سطح کاریشون وجود داشته)؛ برای همین وقتی‌که سراغ زبان سی‌پلاس‌پلاس‌ میان، واقعاً مقاومت فوق‌العاده بالایی دارند تا اوّل قبول بکنند:سی‌پلاس‌پلاس، سی نیست. صرفاً زیادی شبیه به سی هست.توابع &lt;algorithm&gt; اکثراً constexpr هستند و می‌تونند سربار محاسبات ثبات رو توی Compile Time ببرن.قالب Iterator و روند کارکرد Iteratorها چیز عجیب غریبی نیست و شدیداً می‌تونه کمک بکنه.هیچ نیازی نیست که نگران Name Conflict باشید وقتی که Namespaceها و Static Polymorphism دارید.برای مثال بیاید یه نگاهی به این کد بندازیم:کدی که یک برنامه‌نویس سی، به زبان سی‌پلاس‌پلاس، برای پیدا کردن بیشترین تعداد کلمات یک عبارت توی یک پاراگراف میزنه.امّا جوری که باید به زبان سی‌پلاس‌پلاس زده بشه.</description>
                <category>قاسم رمضانی‌منش</category>
                <author>قاسم رمضانی‌منش</author>
                <pubDate>Fri, 03 Sep 2021 18:58:11 +0430</pubDate>
            </item>
                    <item>
                <title>یک مکان بهتر برای const</title>
                <link>https://virgool.io/@another-ghasem/%DB%8C%DA%A9-%D9%85%DA%A9%D8%A7%D9%86-%D8%A8%D9%87%D8%AA%D8%B1-%D8%A8%D8%B1%D8%A7%DB%8C-const-d89r3zw5am4i</link>
                <description>در زبان سی‌پلاس‌پلاس، همیشه باید const در زمان تعریف/اعلان، جلوی نوع شما قرار بگیره. منتهیٰ این اجازه هم داده شده که مثل الباقی زبان‌های C-Like شما const رو پشت نوع هم قرار بدید. که اینکار واقعاً توی نوع‌های پیچیده می‌تونه خوانایی کد رو خراب بکنه. مثلاً به این تعریف توجه کنید:در نگاه اوّل کمی زمان‌بر هست که بگیم str_ptr یک اشاره‌گر ثابت به نوع std::string هست و یا یک اشاره‌گر به یک نوع ثابت std::string هست؟ یا حتیٰ بدتر، این تعریف رو ببینید:امّا اگه const رو در جلوی نوع خودمون بنویسیم، خیلی راحت‌تر می‌تونیم این تعریف رو متوجه بشیم:حالا کافی هست که این تعریف رو از سمت راست به چپ بخونیم: «متغیر str_ptr یک اشاره‌گر ثابت به نوع ثابت std::string هست.https://isocpp.org/wiki/faq/const-correctness</description>
                <category>قاسم رمضانی‌منش</category>
                <author>قاسم رمضانی‌منش</author>
                <pubDate>Fri, 03 Sep 2021 00:06:52 +0430</pubDate>
            </item>
                    <item>
                <title>یکی از باوفاترین ابزارهای برنامه‌نویسی، ASAN</title>
                <link>https://virgool.io/@another-ghasem/%DB%8C%DA%A9%DB%8C-%D8%A7%D8%B2-%D8%A8%D8%A7%D9%88%D9%81%D8%A7%D8%AA%D8%B1%DB%8C%D9%86-%D8%A7%D8%A8%D8%B2%D8%A7%D8%B1%D9%87%D8%A7%DB%8C-%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D9%87-%D9%86%D9%88%DB%8C%D8%B3%DB%8C-asan-dmxxgcq9b4ks</link>
                <description>واقعاً یکی از باوفاترین ابزارهای برنامه‌نویسی، به نظرم، ASAN هست که دسترسی‌های نادرست به حافظه رو تشخیص داده و سریعاً Process برنامه‌ٔ ما رو توی گونی می‌کنه قبل از اینکه دچار Undefined Behavior یا دریافت Segmentation Fault از سیستم‌عامل بشیم و کلّی وقت خودمون رو صرف Debugging بکنیم.این کد رو در نظر بگیرید:کد بالا عملاً Undefined Behavior هست. چرا که ما داریم Iteratorها رو خراب می‌کنیم. امّا کد ممکن هست که در بیشتر مواقع (شایدم کم‌تر مواقع) رفتاری که انتظار داریم رو داشته باشه؛ چون Undefined Behavior هست. و چون دارید یک Constant Reference از شئ ارسال می‌کنید به تابع اگه خوش‌شانس باشید و دچار Segmentation Fault هم بشید؛ با یک Stack Trace طولانی از Constructorها و Destructorهای ترکیده ممکن هست که روبه‌رو بشید و یکی دو ساعت بشینید دنبال پرتغال‌فروش بگردید.امّا اگه همین کد رو با ASAN لینک و Compile بکنید. بلافاصله برنامه با خطای مشابه:==29284==ERROR: AddressSanitizer: heap-use-after-free on address 0x6070000000c0بسته میشه که اگه Log رو دقیق ناگه کنیم. داره توضیح میده که:READ of size 7 at  0x6070000000c0 thread T1 ... 0x6070000000c0 is located 48 bytes inside  of 72-byte region freed by thread T0 here ... previously allocated by  thread T0 here ...حافظه‌ای که داریم زور می‌زنیم بخونیمش، قبلاً حذف شده ...(دلیل اینکه تعداد خطوط خروجی زیاد هست. به خاطر این‌که داره کاملاً روندی که باعث خطا شده و توابعی که صدا زده شده رو توضیح میده. تند تند Scroll نکنید و بررسی بکنید.)</description>
                <category>قاسم رمضانی‌منش</category>
                <author>قاسم رمضانی‌منش</author>
                <pubDate>Tue, 31 Aug 2021 23:01:26 +0430</pubDate>
            </item>
                    <item>
                <title>شاه‌کار دیگه‌ای از id Software</title>
                <link>https://virgool.io/@another-ghasem/%D8%B4%D8%A7%D9%87-%DA%A9%D8%A7%D8%B1-%D8%AF%DB%8C%DA%AF%D9%87-%D8%A7%DB%8C-%D8%A7%D8%B2-id-software-ylrdgljtwmeo</link>
                <description>کمپانی id Software به حرکت زیباشون توی محاسبهٔ Inverse Square Root به سبک سامورایی بین بچه‌های گرافیک سه‌بعدی خیلی خوب مشهور هستند:Fast Inverse Square Root In Quake III Arena داشتم کد بازی Wolfenstein 3D رو نگاه می‌کردم که به این ماکروی عجیب ISPOINTER بر خوردم:#define ISPOINTER(x) ((((uintptr_t)(x)) &amp;amp;amp; ~0xffff) != 0) خیلی جالبه که اینقدر دقیق روی معماری پلتفرم مقصدشون حساب می‌کردند که حتماً Layout اشاره‌گرهاشون به این‌صورت هست که بتونند دادهٔ بیشتری داخلش ذخیره بکنند و اینقدر راحت هم بررسی بکنند آیا داده‌ای داخلش Valid هست یا نه. داخل Kernel Linux هم از این کارها انجام مید‌ند، ولی خب اونا مختص یک پلتفرم نوشته شده و دقیقاً‌ حالات مختلف رو رعایت کردند. How to determine if a variable is a pointer in the id Software programmers way?</description>
                <category>قاسم رمضانی‌منش</category>
                <author>قاسم رمضانی‌منش</author>
                <pubDate>Mon, 30 Aug 2021 21:28:16 +0430</pubDate>
            </item>
                    <item>
                <title>سی‌پلاس‌پلاس و زمین مین</title>
                <link>https://virgool.io/@another-ghasem/%D8%B3%DB%8C-%D9%BE%D9%84%D8%A7%D8%B3-%D9%BE%D9%84%D8%A7%D8%B3-%D9%88-%D8%B2%D9%85%DB%8C%D9%86-%D9%85%DB%8C%D9%86-opoms7dxq9ny</link>
                <description>برنامه‌نویسی به زبان سی‌پلاس‌پلاس، قشنگ مثل قدم زدن توی میدون مین هست. شاید نقشهٔ مین‌ها رو کاملاً بدونی‌ها؛ امّا امکان این هم هست که یک لحظه فراموشی باعث ترکیدنت بشه. چند وقت پیش من Argument Dependent Lockup رو فراموش کردم و قشنگ یکی دو ساعت الاف شدم:C++ Template Function Conflicts توی کتاب آقای استراستروپ در بخش‌های 14.2.4§ و 18.2.5§ توضیح داده شده.</description>
                <category>قاسم رمضانی‌منش</category>
                <author>قاسم رمضانی‌منش</author>
                <pubDate>Mon, 30 Aug 2021 21:19:57 +0430</pubDate>
            </item>
                    <item>
                <title>وقتی کارفرماهای ایرانی پاشون توی توسعهٔ کامپایلر باز میشه</title>
                <link>https://virgool.io/@another-ghasem/%D9%88%D9%82%D8%AA%DB%8C-%DA%A9%D8%A7%D8%B1%D9%81%D8%B1%D9%85%D8%A7%D9%87%D8%A7%DB%8C-%D8%A7%DB%8C%D8%B1%D8%A7%D9%86%DB%8C-%D9%BE%D8%A7%D8%B4%D9%88%D9%86-%D8%AA%D9%88%DB%8C-%D8%AA%D9%88%D8%B3%D8%B9%D9%87%D9%94-%DA%A9%D8%A7%D9%85%D9%BE%D8%A7%DB%8C%D9%84%D8%B1-%D8%A8%D8%A7%D8%B2-%D9%85%DB%8C%D8%B4%D9%87-tmrrf0vufpdt</link>
                <description>دو روز پیش داشتم با یک کتابخونه‌ای کار می‌کردم (spdlog) که یکی از APIـهاش یک std::initializer_list می‌گرفت،‌ امّا من یک std::vector داشتم؛ خواستم تبدیل کنم به std::initializer_list که با پیاده‌سازی عجیب‌غریبش توی ++libstd روبه‌رو شدم (قبلاً توی کتاب آقای استراستروپ، یک پیاده‌سازی خیلی ساده‌ای رو دیده بودم، همچنین توی متن استاندارد که یک پیاده‌سازی براش نوشته بود). چرا عجیب‌غریب؟ خودتون ببینید:فقط یک نگاه به Constructorهایی که داره بکنید ?. تنها Constructor قابل دسترسیش، Private هست. یعنی عملاً شما نباید بتونید هیچ شئ‌ای از این نوع درست بکنید. ولی خب ... می‌تونید. داخل سوألات StackOverFlow هم با جواب‌هایی مثل Template Hacking برای تبدیل std::vector به std::initializer_list روبه‌رو شدم. یک نفر داخل StackOverFlow جوابی با مضمون اینکه «این کلاس، یکی یه دونهٔ کامپایلر هست» داده بود. سراغ کدهای LLVM/Clang و GCC رفتم که و دیدم بله، ما واقعاً نمی‌تونیم حتیٰ یک کلاسی مثل std::initializer_list بنویسیم و این تماماً توی Compiler تنظیم شده که وقتی به یک Initialize List برخورد می‌کنه؛ اگه Overload مناسبش رو پیدا کرد، یک &lt;std::initializer_list&lt;T برای شما درست بکنه، که اینجا اون T میشه نوعی که شما دارید داخل Initialize Listـتون استفاده می‌کنید.کامنت‌هایی که در جواب این سوألم نوشته شده جالبه:https://stackoverflow.com/questions/68743469/why-we-need-a-private-constructor-for-stdinitializer-listهرچند که من هنوز قانع نشدم که چرا باید این کلاس یک Private Constructor داشته باشه در حالی که حالت پیشنهادی استاندارد یه همچین چیزی نیست و اگر اینقدر سوگولی کامپایلر هست، برای چی موقع ارائه توی استاندارد ۱۱ این رو به عنوان یک Keyword یا حتیٰ یکی دیگه از حالات Initialization تبدیل نکردند؟ حس می‌کنم که یک قابلیّت زور-چاپونی هست ?.</description>
                <category>قاسم رمضانی‌منش</category>
                <author>قاسم رمضانی‌منش</author>
                <pubDate>Sun, 29 Aug 2021 18:26:05 +0430</pubDate>
            </item>
                    <item>
                <title>کمک به پردازنده در برنامه‌های چند-نخی</title>
                <link>https://virgool.io/@another-ghasem/%DA%A9%D9%85%DA%A9-%D8%A8%D9%87-%D9%BE%D8%B1%D8%AF%D8%A7%D8%B2%D9%86%D8%AF%D9%87-%D8%AF%D8%B1-%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D9%87-%D9%87%D8%A7%DB%8C-%DA%86%D9%86%D8%AF-%D9%86%D8%AE%DB%8C-di2pplm6vfqv</link>
                <description>توی برنامه‌های Multi-threadingـی که Tight Loopـهای زیاد یا پرتکراری دارید،‌همیشه حواستون به Data Locality و Cache Missـها باشه؛ چون خیلی راحت می‌تونند دهن پردازنده رو با خاک یکی بکنند. به این مثال و خروجیش دقّت بکنید (لینک کد):پیشنهاد می‌کنم که کتاب Is Parallel Programming Hard, And, If So, What Can You Do About It? رو مطالعه بکنید:https://mirrors.edge.kernel.org/pub/linux/kernel/people/paulmck/perfbook/perfbook.html</description>
                <category>قاسم رمضانی‌منش</category>
                <author>قاسم رمضانی‌منش</author>
                <pubDate>Sat, 28 Aug 2021 21:16:04 +0430</pubDate>
            </item>
                    <item>
                <title>repeat_for&lt;N&gt;(ope);</title>
                <link>https://virgool.io/@another-ghasem/repeat-for-hcqa4pjytwzf</link>
                <description>به نظرم بدترین چیزی که توی کدها میشه دید: Magic Numberها و Constant Literalsها و ... هستند. که امتیاز بدترینشون تعلق می‌گیره به for-statementهایی که صرفاً برای تکرار یک عملیات نوشته شده‌اند. توی این پیش‌نویس من پیشنهاد تابع repeat_for رو دادم که به نظرم برای حذف این for-statementها می‌تونه مفید باشه.چرا for-statment نه؟فقط برای به‌طور ثابت تکرار کردن یه چیزی؟ نه، اونا زشت هستند: متغیر شمارندهٔ اضافی.شرط خروج اضافی.و Increment Statement اضافی.امّا با استفاده از repeat_for:پیاده‌سازی repeat_forتابع repeat_for پیاده‌سازی بسیار ساده‌ای داره:بهینه‌سازی کامپایلرhttps://godbolt.org/z/7enqn7oa7عملاً این تابع هیچ سربار اضافه‌ای غیر از یک Function Call نداره.</description>
                <category>قاسم رمضانی‌منش</category>
                <author>قاسم رمضانی‌منش</author>
                <pubDate>Fri, 27 Aug 2021 18:35:20 +0430</pubDate>
            </item>
            </channel>
</rss>