الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

النصوص في ++c, أي الطريقتين أفضل!

مغلق
بدأه Khaled.Alshaya في 19 يناير 2008 · 31 رد · 3,808 مشاهدة · في اختبر قداراتك
مشاركة: واتساب X فيسبوك تيليجرام
#26

السلام عليكم ورحمة الله

Khaled.Alshaya كتب:
أستاذ عماد , أوامر المعالج إما أن تأخذ معاملين أو معامل واحد أو لا تأخذ أي معامل, هذا يعتمد على الأمر نفسه,

بالضبط اخى الفاضل , فهى ايضا بتعتمد على نوع المؤثر او العملية المستخدمه وعدد البارمترات اللازمه لكل عملية. فهناك عمليات احادية unary تحتاج بارمتر واحد فقط مثل الدوال المثلثية (Sin, Cos, etc) , وهناك عمليات ثنائية binary تحتاج بارمترين مثل عمليات الجمع والطرح وغيرها. وكذلك توجد بعد العمليات الثلاثية ternary والتى تحتاج ثلاث بارمترات مثل الدالة الشرطية if.

باسم الموجي كتب:
هههههههههههههههه

انت ما جتش تمسك عليه غير دي :) :) :)

اى حاجه وخلاص , علشان نخليك تطلع اللى فى جعبتك من علوم ونستفيد كلنا. طريقة قديمة لاسخراج المعلومات:)

Blueteeth كتب:
أخوانى م/عماد و م/باسم, إنتوا الإتنين كلامكوا مية مية والله :) المعالج مصمم بحيث إنه يعمل عملية الجمع الثنائية فقط, لماذا؟ لأنها معرفة كذلك كأبسط عملية جمع فى الرياضيات, و العمليات الأخرى يمكن تركيبها من عملية الجمع الثنائية هذه. مفيش داعى بقا حد يمسك على حد حاجة :D

أخى الفاضل بارك الله فيك , وكلامى مع اخى باسم مجرد مزاح :)

باسم الموجي كتب:
إنت مش واخد بالك أصل كان فيه موضوع عن الجذور التخيلية في منتدى الرياضيات وكان في نزاع جامد في الموضوع والكلام ده من مخلفات الحرب :)

الحمد لله دى حرب مخلفاتها مفيدة , مش زى الحروب الثانية. ربنا يكثر من امثالها :)

Khaled.Alshaya كتب:
أنا كنت من متابعي المناقشة الرائعة بالمناسبة :) و لا أعتقد أنها حرب, لأنها كانت مبارزات علمية بين الأخوة ,,

أخى الكريم بارك الله فيك. ونتمنى فعلا تكون المناقشة هناك اتت ثمارها العلمية واستفدت حضرتك واستفاد كل من تابعها.

بالله التوفيق ,,,

أشهد أن لا إله إلا الله وأشهد أن محمدا رسول الله

bnr025.gif

مـــوقـــعـــى

#27
اقتباس
بالنسبة للسطر الثاني, فسيتم إضافة str3 إلى str2, و بعد ذلك يعيد str2 نفسه بالمرجع, و سيتم نسخ str2 إلى str1, لاحظ أن str2 قد تغير إضافة إلى أن str1 قد حصل على ناتج الجمع من str2 و ليس من كائن جديد كما في الحالة السابقة,

أخى الكريم, أنت إختصرت الخطوات خلال كلامك, فالذى يحدث هو أن يضيف str1 و str2 فى tempobject ثم يضع هذا الكائن فى str2 ثم يرجع str2 بالمرجع, و هكذا خلال ال chain اللى إنتا كاتبها.

اقتباس
فلماذا اخترعوا += من الأساس

للإختصار, تماما كما إخترعوا ال Ternary Operator "?:", عوضا عن if......else لكن فى الأخر الكومبايلر حي implement الحاجتين بنفس الطريقة.

اقتباس
i++

OR

i+=1

هما الإتنين واحد, لأن الكومبايلر فى الأخر حيزود واحد على قيمة ال i, و هذه العملية لا تحتمل أكثر من طريقة لعملها, فا كود الأسمبلى اللى حينفذ العمليتين حيبقى واحد.

والله أعلم.

#28

السلام عليكم ,,

أهلاً بك أخي أحمد,

اقتباس
أخى الكريم, أنت إختصرت الخطوات خلال كلامك, فالذى يحدث هو أن يضيف str1 و str2 فى tempobject ثم يضع هذا الكائن فى str2 ثم يرجع str2 بالمرجع, و هكذا خلال ال chain اللى إنتا كاتبها.

الحقيقة أني راجعت الكود الخاص بالـ string ,, و هذا هو الكود الخاص بالمعامل =+ :

basic_string& operator+=(const basic_string& __s) { return append(__s); }
  basic_string& operator+=(const _CharT* __s) { return append(__s); }
  basic_string& operator+=(_CharT __c) { push_back(__c); return *this; }

لا حظ أن عملية الإضافة أو الـ Apeending لا تحجز كائن جديد, و لكنها تضيف العناصر للـ Data Sturcture المستخدمة في كائن النص, ثم يقوم الكائن بإرجاع نفسه بالمرجع!

أما في حالة المعامل + :

template <class _CharT, class _Traits, class _Alloc>
inline basic_string<_CharT,_Traits,_Alloc>
operator+(const basic_string<_CharT,_Traits,_Alloc>& __x,
		  const basic_string<_CharT,_Traits,_Alloc>& __y)
{
  typedef basic_string<_CharT,_Traits,_Alloc> _Str;
  typedef typename _Str::_Reserve_t _Reserve_t;
  _Reserve_t __reserve;
  _Str __result(__reserve, __x.size() + __y.size(), __x.get_allocator());
  __result.append(__x);
  __result.append(__y);
  return __result;
}

لاحظ الكائن الجديد __result , حيث أصبح حجمه يساوي مجموع حجم النصين الذين نريد جمعهما ثم تمت إضافة النصوص إليه, و تمت إعادته by value ,,

أتمنى أن تستمر المناقشة, فهذه أول مرة اقوم بالاطلاع على الكود الخاص بالـ STL :D ,,

تحياتي ,,

تم تعديل هذه المشاركة بواسطة Khaled.Alshaya في 22 يناير 2008 في 21:47

#29
اقتباس
هما الإتنين واحد, لأن الكومبايلر فى الأخر حيزود واحد على قيمة ال i, و هذه العملية لا تحتمل أكثر من طريقة لعملها, فا كود الأسمبلى اللى حينفذ العمليتين حيبقى واحد.

والله أعلم.

بل تحتمل طريقتين لو افترضنا مثلا أن i موجودة في Ax فالأولى ستكون

Inc Ax

وهذه العملية تحتاج إلى احضار المتغير i من الذاكرة إلى الـ Register الخاص بالمعالج ثم تفعيل الكود الخاص بعمل increment عن طريق الـ control lines

أما الثانية فستكون

Add Ax,1

وهي تحتاج إلى احضار المتغير i من الذاكرة كما في الحالة الأولى بالإضافة إلى احضار القيمة واحد من الذاكرة أيضا ثم تفعيل الكود الخاص بعمل addition عن طريق الـ control lines

وهذا يعني أن الأمر الثاني سيستهلك عملية اضافية بلا داعي

طبعا هذا إذا لم يقوم المترجم بعمل Optimization كما ذكر الأخ خالد

من أقوال الأئمة

الإمام علي بن أبي طالب -رضي الله عنه-: "الناس ثلاثة : فعالم رباني ، ومتعلم على سبيل النجاة ، وهمج رِعاع غوغاء أتباع كل ناعق ، يميلون مع كل ريح ، لم يستضيئوا بنور العلم ، ولم يلجئوا إلى ركن وثيق".

الإمام مالك -رحمه الله- : " لن يصلح آخر هذه الأمة إلا بما أصلح به أولها ".

الإمام الأوزاعي -رحمه الله- : " عليك بآثار من سلف وإن رفضك الناس وإياك وآراء الرجال وإن زخرفوه لك بالقول ".

الإمام الفضيل بن عياض -رحمه الله- : " عليك بطرق الهدى و لا يضرك قلة السالكين و إياك و طرق الضلالة ولا يغرك كثرة الهالكين ".

علامة الزمان الإمام الألباني -رحمه الله- : " إن الخلاص إلى أيدي هؤلاء الشباب يتمثل في أمرين لا ثالث لهما ؛ التصفية والتربية ".

وكل خير في اتباع من سلف وكل شر في ابتداع من خلف

#30

ممممم فعلا أخى باسم عندك حق, إذا لم يقم المترجم بعمل Optimization و بإفتراض أن المعالج يتعرف على أمر Inc, فإن الطريقة الأولى سوف تصبح أسرع من الثانية. بارك الله فيك يا أخى على هذه الملاحظة القيمة.

أخى خالد, أعتذر عن عدم التوضيح من الأول, أنت تتكلم أخذاً فى إعتبارك النوع string, بينما أنا أتكلم أخذا فى إعتبارى الأنواع البسيطة مثل int و double. فالأنواع مثل string طبيعتها أنها arrays و بالتالى إذا كنت تريد أن تضيف عليها ممكن أن تضع علطول داخلها. لكن الأنواع البسيطة أعتقد سلوكها غير ذلك.

أنا مثلك والله يا أخى أيضا أتمنى إستمرار هذه المناقشة لأنها مفيدة فعلا و أنا عن نفسى إتعلمت أشياء مجتش على بالى قبل كدة.

و يا ريت لو عرفت توصل لل implementation بتاع أى كومبايلر تحطه و تورينا جايز يبقى بيعمل حاجة تانية خالص مجتش فى بالنا :)

بارك الله فيكم و زادكم من علمه.

#31

بخصوص += و =

إذا افترضنا أن الأمر Add يدعم الكتابة في الذاكرة مباشرة فيمكن القيام بالآتي

سنفترض أن A موجودة بالعنوان 100 في الذاكرة و B في العنوان 101

إذا كتبنا

A+=B

فيكون كود الأسمبلي كالآتي

mov ax,M[101]
add M[100],ax

أما إذا كتبنا

A=A+B

فسيكون كود الأسمبلي كالآتي

mov ax,M[101]
add ax,M[100]
mov M[100],ax

طبعا نحن افترضنا في الكود الأخير أن السي بلس بلس لم ينتبه إلى وجود A في الطرفين وهذا ما سيحدث عادة إذا لم نقم بعمل Optimzation

من أقوال الأئمة

الإمام علي بن أبي طالب -رضي الله عنه-: "الناس ثلاثة : فعالم رباني ، ومتعلم على سبيل النجاة ، وهمج رِعاع غوغاء أتباع كل ناعق ، يميلون مع كل ريح ، لم يستضيئوا بنور العلم ، ولم يلجئوا إلى ركن وثيق".

الإمام مالك -رحمه الله- : " لن يصلح آخر هذه الأمة إلا بما أصلح به أولها ".

الإمام الأوزاعي -رحمه الله- : " عليك بآثار من سلف وإن رفضك الناس وإياك وآراء الرجال وإن زخرفوه لك بالقول ".

الإمام الفضيل بن عياض -رحمه الله- : " عليك بطرق الهدى و لا يضرك قلة السالكين و إياك و طرق الضلالة ولا يغرك كثرة الهالكين ".

علامة الزمان الإمام الألباني -رحمه الله- : " إن الخلاص إلى أيدي هؤلاء الشباب يتمثل في أمرين لا ثالث لهما ؛ التصفية والتربية ".

وكل خير في اتباع من سلف وكل شر في ابتداع من خلف

#32

السلام عليكم ,,

بارك الله فيكم يا أخوة :rolleyes:

موضوع الـ Optimizations ليس سهلاً أبداً, أحياناً لا يكون بتلك الأهمية و أحياناً لا مفر منه!

و بالحديث عن Intel, هذه الشركة توفر لك مكتبات very optimized للمطورين لكي يعملوا عليها في مجالات البرمجة الأساسية,

مثلاً, ألقي نظرة على هذه المكتبة و شاهد الـ Demo الخاص بها, تحتوي على خوارزميات الصوت و الصورة و التشفير ..... :

Integrated Performance Primitives 5.3

انظر إلى مكتبة الـ Math الخاصة بـ Intel B) :

Math Kernel Library 10.0

تحياتي ,,

هذا الموضوع مغلق.

مواضيع مشابهة