PDA

View Full Version : سوال: مظنور از :: چیست؟



irpersian20
دوشنبه 08 اردیبهشت 1393, 20:25 عصر
سلام
منظور از :: چیست؟
this_thread::sleep_for(chrono::milliseconds(12));
مثلا در دستور بالا

rahnema1
دوشنبه 08 اردیبهشت 1393, 21:51 عصر
سلام
برای دسترسی به یک شمارنده enum یا عضو یک کلاس یا عضو یک فضای نام میشه از عملگر :: استفاده کرد
توی اینجا ما دو تا فضای نام namespace داریم به نام this_thread و chrono که در اولی تابعی به نام sleep_for وجود داره ودر دومی تابعی به نام milliseconds
که برای دسترسی به اون تابعها لازمه از این عملگر استفاده کنیم همچنین برای پرهیز از استفاده از این عملگر می تونیم از using استفاده کنیم

using namespace this_thread;
using namespace chrono;
sleep_for(milliseconds(12));

Mr.orange
دوشنبه 08 اردیبهشت 1393, 22:08 عصر
سلام
برای دسترسی به یک شمارنده enum یا عضو یک کلاس یا عضو یک فضای نام میشه از عملگر :: استفاده کرد
توی اینجا ما دو تا فضای نام namespace داریم به نام this_thread و chrono که در اولی تابعی به نام sleep_for وجود داره ودر دومی تابعی به نام milliseconds
که برای دسترسی به اون تابعها لازمه از این عملگر استفاده کنیم همچنین برای پرهیز از استفاده از این عملگر می تونیم از using استفاده کنیم

using namespace this_thread;
using namespace chrono;
sleep_for(milliseconds(12));


یه سوال
اگه در هر دو کلاس تایعی بنام milliseconds وجود داشته باشه و قبلش از using‌ به شکل بالا استفاده کنیم؛ تابع milliseconds در کدام کلاس اجرا میشه؟

یعنی اینطوری
using namespace this_thread;
using namespace chrono
milliseconds(1);

ممنون

rahnema1
دوشنبه 08 اردیبهشت 1393, 22:15 عصر
واسه همینه که می گیم از:: استفاده بشه تا اشتباه نشه و error نده

irpersian20
دوشنبه 08 اردیبهشت 1393, 23:18 عصر
سلام
برای دسترسی به یک شمارنده enum یا عضو یک کلاس یا عضو یک فضای نام میشه از عملگر :: استفاده کرد
توی اینجا ما دو تا فضای نام namespace داریم به نام this_thread و chrono که در اولی تابعی به نام sleep_for وجود داره ودر دومی تابعی به نام milliseconds
که برای دسترسی به اون تابعها لازمه از این عملگر استفاده کنیم همچنین برای پرهیز از استفاده از این عملگر می تونیم از using استفاده کنیم

using namespace this_thread;
using namespace chrono;
sleep_for(milliseconds(12));

سلام
ممنون از توضیح
اما هر ترد اگر برای یک تابع باشد. آن وقت این using سراسری مشکل ساز نمیشود؟
مثلا بخواهیم هر ترد را به طور خاص کنترل کنیم.
آن وقت از کجا بفهمه کدام ترد رو باید sleep کنه؟


void test ()
{
Sleep one milisecond.
}
void test 2()
{
Sleep one milisecond.
}
void test 3()
{
Sleep one milisecond.
}
void main ()
{
thread t1(test 1);
thread t2(test 2);
thread t3(test 3);
}

rahnema1
دوشنبه 08 اردیبهشت 1393, 23:48 عصر
شما از join هم استفاده می کنید؟

t1.join();
t2.join();
t3.join();

هر سه تا sleep میشه

mohsen_nikoei
شنبه 28 شهریور 1394, 01:23 صبح
To in tabe chikar mikone in amalgar



void * sampledata: :operatod new (size_t size(
{


return(void*)::new char[size];x

}

rahnema1
شنبه 28 شهریور 1394, 08:37 صبح
عبارت new char[size]; را در ++C بهش می گن «عبارت تخصیص حافظه». وقتی این عبارت در جایی از برنامه استفاده بشه موجب می شه تابعی به نام «تابع تخصیص حافظه» صدا زده بشه. این تابع به صورت پیش فرض وجود داره که جای اون هم در فضای نام سراسری هست و اسمش هم []operator new یا در مواردی که آرایه نباشه operator new هست. اما خود ما هم می تونیم تابع تخصیص حافظه تعریف کنیم که به جای تابع پیش فرض مورد استفاده قرار بگیره. یعنی همین کاری که شما با void * sampledata::operatod new(size_t size) انجام دادید.
اگه قبل از عبارت تخصیص حافظه از :: استفاده بشه موجب میشه کامپایلر به دنبال تابع تخصیص حافظه ای بگرده که در فضای نام سراسری قرار داره
بنابراین عبارت ::new char[size]; با استفاده از تابع تخصیص حافظه ای که در فضای نام سراسری قرار داره فضایی را حداقل به اندازه size اشغال می کنه و اشاره گری از نوع char یا همون *char را بر می گردونه با استفاده از (*void) نوع این اشاره گر را از *char به *void تبدیل می کنیم
سوال؟ اگه در عبارت عبارت return (void*) ::new char[size];از :: استفاده نمی کردیم مشکلی به وجود می آمد؟
جواب: چون char از انواع اصلی هست و کلاس نیست اگه :: هم نذاریم همون تابع تخصیص حافظه پیش فرض که در فضای نام سراسری قرار داره واسه اون صدا زده می شه و :: شاید فقط جهت تاکید این نکته به خواننده اومده باشه
سوال :اگه در همون عبارت از (*void) استفاده نمی کردیم مشکلی به وجود می اومد؟
جواب: هر اشاره گری می تونه به *void تبدیل بشه در اینجا تبدیل به صورت ضمنی انجام می شه و نیازی به cast یا تبدیل صریح نیست و مثل قبلی شاید جهت تاکید روی اینکه تابع اشاره گر void برمی گردونه اومده باشه یعنی اگه عبارت به صورت return new char[size]; نوشته می شد مشکلی به وجود نمی اومد
اما اهمیت :: هنگام استفاده از new را در مثال زیر می تونید مشاهده کنید
در حالت اول یک شیء با استفاده از تابع تخصیصی که خودمون تعریف کردیم ایجاد می شه
اما در حالت دوم شیء با استفاده از تابع تخصیص پیش فرض ساخته می شه

#include <iostream>

class sampledata{
public:
void * operator new(size_t size);
};
void * sampledata::operator new(size_t size)
{
std::cout << "non-default New" << std::endl;
return (void*) ::new char[size];
}

int main()
{
std::cout<<"create object with non-defalut new:"<< std::endl;
sampledata* s1 = new sampledata;
std::cout<<"create object with defalut new:"<< std::endl;
sampledata* s2 = ::new sampledata;
}

mohsen_nikoei
دوشنبه 13 مهر 1394, 10:35 صبح
عبارت new char[size]; را در ++C بهش می گن «عبارت تخصیص حافظه». وقتی این عبارت در جایی از برنامه استفاده بشه موجب می شه تابعی به نام «تابع تخصیص حافظه» صدا زده بشه. این تابع به صورت پیش فرض وجود داره که جای اون هم در فضای نام سراسری هست و اسمش هم []operator new یا در مواردی که آرایه نباشه operator new هست. اما خود ما هم می تونیم تابع تخصیص حافظه تعریف کنیم که به جای تابع پیش فرض مورد استفاده قرار بگیره. یعنی همین کاری که شما با void * sampledata::operatod new(size_t size) انجام دادید.
اگه قبل از عبارت تخصیص حافظه از :: استفاده بشه موجب میشه کامپایلر به دنبال تابع تخصیص حافظه ای بگرده که در فضای نام سراسری قرار داره
بنابراین عبارت ::new char[size]; با استفاده از تابع تخصیص حافظه ای که در فضای نام سراسری قرار داره فضایی را حداقل به اندازه size اشغال می کنه و اشاره گری از نوع char یا همون *char را بر می گردونه با استفاده از (*void) نوع این اشاره گر را از *char به *void تبدیل می کنیم
سوال؟ اگه در عبارت عبارت return (void*) ::new char[size];از :: استفاده نمی کردیم مشکلی به وجود می آمد؟
جواب: چون char از انواع اصلی هست و کلاس نیست اگه :: هم نذاریم همون تابع تخصیص حافظه پیش فرض که در فضای نام سراسری قرار داره واسه اون صدا زده می شه و :: شاید فقط جهت تاکید این نکته به خواننده اومده باشه
سوال :اگه در همون عبارت از (*void) استفاده نمی کردیم مشکلی به وجود می اومد؟
جواب: هر اشاره گری می تونه به *void تبدیل بشه در اینجا تبدیل به صورت ضمنی انجام می شه و نیازی به cast یا تبدیل صریح نیست و مثل قبلی شاید جهت تاکید روی اینکه تابع اشاره گر void برمی گردونه اومده باشه یعنی اگه عبارت به صورت return new char[size]; نوشته می شد مشکلی به وجود نمی اومد
اما اهمیت :: هنگام استفاده از new را در مثال زیر می تونید مشاهده کنید
در حالت اول یک شیء با استفاده از تابع تخصیصی که خودمون تعریف کردیم ایجاد می شه
اما در حالت دوم شیء با استفاده از تابع تخصیص پیش فرض ساخته می شه

#include <iostream>

class sampledata{
public:
void * operator new(size_t size);
};
void * sampledata::operator new(size_t size)
{
std::cout << "non-default New" << std::endl;
return (void*) ::new char[size];
}

int main()
{
std::cout<<"create object with non-defalut new:"<< std::endl;
sampledata* s1 = new sampledata;
std::cout<<"create object with defalut new:"<< std::endl;
sampledata* s2 = ::new sampledata;
}














argoman tabe new (size_t size) koja mored estefade ghara gereft ?

rahnema1
دوشنبه 13 مهر 1394, 14:28 عصر
همون طور که قبلا اشاره کردم عبارت تخصیص حافظه، تابع تخصیص حافظه را صدا می زنه مثلا ما اگه بنویسیم new int[10]; این عدد 10 که ما دادیم یه تغییراتی در اون صورت می گیره یعنی مثلا سایز int که برابر 4 باشه ابتدا 10 ضرب در 4 می شه و با یک عددی (مثلا y ) جمع می شه و عدد نهایی که ایجاد می شه توسط عبارت تخصیص حافظه به تابع تخصیص حافظه پاس داده می شه
یعنی توسط عبارت تخصیص حافظه، تابع تخصیص حافظه به صورت زیر فراخوانی می شه
operator new[](10 * sizeof(int) + y)

mohsen_nikoei
سه شنبه 14 مهر 1394, 15:43 عصر
همون طور که قبلا اشاره کردم عبارت تخصیص حافظه، تابع تخصیص حافظه را صدا می زنه مثلا ما اگه بنویسیم new int[10]; این عدد 10 که ما دادیم یه تغییراتی در اون صورت می گیره یعنی مثلا سایز int که برابر 4 باشه ابتدا 10 ضرب در 4 می شه و با یک عددی (مثلا y ) جمع می شه و عدد نهایی که ایجاد می شه توسط عبارت تخصیص حافظه به تابع تخصیص حافظه پاس داده می شه
یعنی توسط عبارت تخصیص حافظه، تابع تخصیص حافظه به صورت زیر فراخوانی می شه
operator new[](10 * sizeof(int) + y)



در مثالی که زدید sampledata* s1 = new sampledata حافظه برای 1 شی تخصیص میشه یعنی ارگومان تابع سربارگذاری new عدد 1 هست و دراین صورت new char[1] یک بایت حافظه تخصیص میکنه؟

rahnema1
سه شنبه 14 مهر 1394, 15:56 عصر
در مورد sampledata چون داریم از عبارت new به صورت غیر آرایه ای استفاده می کنیم به صورت زیر در میاد:
operator new(sizeof(sampledata))
اما اگه به صورت آرایه ای بود با y که یک مقدار نامعلومه جمع می شد
در مورد [new char[1 چون حالت آرایه ای هست از y استفاده می شه اما ممکنه y برابر با صفر باشه
ضمن اینکه مقدار y ممکنه در دو بار استفاده متفاوت باشه و ضمانتی نیست که هر دفعه یکسان باشه!