مرتب سازی حافظه
مرتب سازی حافظه در زمان کامپایل > مسائل خاص نظم حافظه > جلوه‌های ترتیب برنامه شامل دستورهای اشاره گر

حال موردی را در نظر بگیرید که در آن همان عمل جمع با اشاره گر غیرمستقیم بیان شود، مثلاً در زبان‌هایی مثل C/C++:
;sum = *a + *b + *c
عبارت x* یک اشاره‌گر نامیده می‌شود و مکانی از حافظه را که با مقدار فعلی x مشخص شده‌است، می‌خواند. اثر خواندن از یک اشاره گر توسط مدل حافظه معماری مشخض می‌شود. هنگام خواندن از حافظه استاندارد برنامه، به دلیل ترتیب دستور خواندن حافظه، عوارض جانبی وجود ندارد. در برنامه‌نویسی سیستم‌های جاسازی شده، بسیار رایج است که I/O با نقشه حافظه داشته باشیم که در آن دستورهای I/O باعث خواندن و نوشتن در حافظه یا تغییر در حالت عملکرد پردازنده، که عوارض جانبی بسیار قابل مشاهده است، می‌شود. برای مثال بالا، فرض کنید که نشانگرها به حافظه برنامه منظم بدون این عوارض جانبی اشاره می‌کنند. کامپایلر آزاد است که این خوانش‌ها را به نحوی که مناسب می‌داند، مرتب کند و هیچ عوارض جانبی قابل‌مشاهده برنامه وجود نخواهد داشت.
اگر مقدار تخصیص داده شده هم اشاره گر غیرمستقیم باشد چه می‌شود؟
;sum = *a + *b + *c*
در این قسمت، اینکه زبان به کامپایلر اجازه تقسیم را به صورت زیر بدهد، بعید به نظر می‌رسد.
// همان‌طور که توسط کامپایلر بازنویسی شده‌است
// به‌طور کلی ممنوع است
;sum = *a + *b*
;sum = *sum + *c*
این در اکثر موارد ناکارآمد است و نوشتن اشاره گر می‌تواند اثر جانبی بر روی وضعیت قابل مشاهده ماشین داشته باشد. کامپایلر اجازه این تبدیل تقسیم را نمی‌دهد، بنابراین تنها نوشته‌ها در مکان حافظه sum باید به‌طور منطقی از سه اشاره گر خوانده شده از عبارت پیروی کنند.
اما فرض کنید برنامه‌نویس نگران سرریز اعداد صحیح بوده و این عبارت را در سطح برنامه به صورت زیر تقسیم کند:
// به‌طور مستقیم توسط برنامه‌نویس نوشته شده‌است
// با نگرانی‌های دیگر
;sum = *a + *b*
;sum = *sum + *c*
عبارت اول دو خوانش حافظه را کد می‌کند، که باید قبل از اولین نامه به sum* باشد (به هر ترتیب). عبارت دوم دو خوانش حافظه (به هر ترتیب) را کد می‌کند که باید قبل از به روز رسانی دوم sum* باشد. این امر ترتیب دو دستور اضافه را تضمین می‌کند، اما به‌طور بالقوه یک مشکل جدید برای نام مستعار آدرس را معرفی می‌کند: هر کدام از این نکته‌ها می‌توانند به‌طور بالقوه به مکان حافظه مشابه مراجعه کنند.
برای مثال، فرض کنید در این مثال  c* و sum* نام مستعار در یک مکان حافظه دارند و هر دو نسخه برنامه را با sum* برای هر دو بازنویسی کنیم.
;sum = *a + *b + *sum*
اینجا هیچ مشکلی وجود ندارد. مقدار اصلی چیزی که ما در ابتدا به عنوان c* نوشتیم در تخصیص به sum*  و همچنین مقدار اصلی sum*از بین می‌رود، اما این در وهله اول بازنویسی شده بود و هیچ نگرانی خاصی ندارد.
//چیزی که برنامه با c* و sum* مستعارمی شود
;sum = *a + *b*
;sum = *sum + *sum*
در اینجا مقدار اصلی sum* قبل از اولین دسترسی، بازنویسی می‌شود و در عوض معادل جبری بدست می‌آید:
// معادل جبریبالا
;sum = (*a + *b) + (*a + *b)*
که یک مقدار کاملاً متفاوت را به sum* به دلیل تنظیم مجدد دستورها اختصاص می‌دهد.
به دلیل اثرهای احتمالی، تغییر یافتن مجدد دستورهای اشاره‌گر بدون به خطر انداختن اثرهای برنامه قابل‌مشاهده دشوار است. در حالت معمول، ممکن است هیچ نام مستعاری وجود نداشته باشد، بنابراین به نظر می‌رسد که کد مانند قبل اجرا شود. اما در حالتی که نام مستعار وجود دارد، خطاهای شدیدتر ممکن است رخ دهد. حتی اگر این موارد به‌طور کامل در اجرای عادی وجود نداشته باشند، دری را برای یک دشمن مخرب باز می‌کند تا در جایی که نام مستعار وجود دارد، ورودی ایجاد کند، که منجر به یک سوء استفاده امنیتی از رایانه می‌شود.
ترتیب مجدد امن برنامه قبلی به شرح زیر است:
// یک متغیر محلی موقت 'temp' از نوع مناسب را اعلام کنید
;temp = *a + *b
;sum = temp + *c*
در نهایت حالت غیر مستقیم با فراخوانی تابع اضافه را در نظر بگیرید :
;sum = f(*a) + g(*b)*
کامپایلر ممکن است ارزیابی اشاره گرهای a* و b* را زودتر انتخاب کند، ممکن است ارزیابی b* را به بعد از فراخوانی تابع f یا ارزیابی a* را به بعد از فراخوانی تابع g به تعویق بیندازد. اگر تابع f و g اثر جانبی قابل مشاهده نداشته باشند، هر سه گزینه برنامه‌ای با اثر قابل‌مشاهده مشابه تولید خواهند کرد. اگر پیاده سازی f یا g دارای اثر جانبی هر اشاره‌گر باشد، این سه گزینه می‌توانند جلوه‌های برنامه قابل مشاهده مختلفی را ایجاد کنند.