সীমাবদ্ধ কীওয়ার্ডটি সি ++ এর অর্থ কী?


182

আমি সর্বদা অনিশ্চিত ছিলাম, সীমাবদ্ধ কীওয়ার্ডটি সি ++ এর অর্থ কী?

এর অর্থ কী ফাংশনটিতে দেওয়া দুটি বা ততোধিক পয়েন্টার ওভারল্যাপ হয় না? এর অর্থ আর কী?


23
restrictএকটি সি 99 কীওয়ার্ড। হ্যাঁ, আরপিবার্ট এস বার্নস, আমি জানি যে বেশিরভাগ সংকলক সমর্থন করে __restrict__। আপনি নোট করবেন যে ডাবল আন্ডারস্কোর সহ যে কোনও কিছুই সংজ্ঞা দ্বারা, বাস্তবায়ন নির্দিষ্ট এবং এভাবে সি ++ নয় , তবে এর একটি সংকলক নির্দিষ্ট সংস্করণ।
কিটসুনওয়াইএমজি

5
কি? এটি নির্দিষ্টকরণ বাস্তবায়ন নির্দিষ্ট কারণে এটি C ++ করে না; সি ++ নির্দিষ্ট স্টাফকে স্পষ্টভাবে বাস্তবায়নের অনুমতি দেয় এবং এটিকে অস্বীকার করে না বা এটি সি ++ রেন্ডার করে না।
অ্যালিস

4
অ্যালিস কিটসিউনওয়াইএমজি এর অর্থ হ'ল এটি আইএসও সি ++ এর অংশ নয় এবং পরিবর্তে এটি একটি সি ++ এক্সটেনশন হিসাবে বিবেচিত হয়। সংকলক নির্মাতাদের তাদের নিজস্ব এক্সটেনশানগুলি তৈরি এবং বিতরণ করার অনুমতি দেওয়া হয়, যা আইএসও সি ++ এর সাথে সহাবস্থান করে এবং সি ++ এ সাধারণত-কম-বা-বহনযোগ্য অ-সরকারী সংযোজনের অংশ হিসাবে কাজ করে। উদাহরণগুলি এমএসের পুরানো পরিচালিত সি ++, এবং তাদের আরও সাম্প্রতিক সি ++ / সিএলআই হবে। অন্যান্য উদাহরণ প্রাক প্রসেসর নির্দেশনা এবং এই ধরনের সাধারণ কিছু কম্পাইলার, এর দ্বারা সরবরাহ করা ম্যাক্রো হবে #warningডিরেক্টিভের, অথবা ফাংশন স্বাক্ষর ম্যাক্রো ( __PRETTY_FUNCTION__জিসিসি উপর, __FUNCSIG__MSVC উপর, ইত্যাদি)।
জাস্টিন সময় -

4
@ অ্যালিস আমার জ্ঞানের মতে, সি ++ 11 সমস্ত সি 99 এর সম্পূর্ণ সমর্থন জারি করে না, বা সি ++ 14 বা আমি সি ++ 17 সম্পর্কে কী জানি। restrictকোনও সি ++ কীওয়ার্ড হিসাবে বিবেচনা করা হয় না (দেখুন en.cppreferences.com/w/cpp/keyword ) এবং বাস্তবে, restrictC ++ 11 স্ট্যান্ডার্ডের একমাত্র উল্লেখ ( ওপেন- std.org/jtc1/sc22/wg21 দেখুন ) /docs/papers/2012/n3337.pdf , গৌণ সম্পাদকীয় পরিবর্তনসমূহের সাথে এফডিআইএসের একটি অনুলিপি, .217.2 [গ্রন্থাগার। সি।, পিডিএফ পৃষ্ঠা 413) বলে যে:
জাস্টিন সময় - পুনরায় প্রতিষ্ঠিত মনিকা

4
অ্যালিস কিভাবে? আমি অংশ বলছেন যে বিবৃত restrictকরা হয় থেকে বাদ দেওয়া (থেকে বাদ, ফেলে) সি মান লাইব্রেরি ফাংশন স্বাক্ষর এবং শব্দার্থবিদ্যা যখন সেই ফাংশন C ++ স্ট্যান্ডার্ডের গ্রন্থাগার অন্তর্ভুক্ত করা হয়। বা অন্য কথায়, আমি এই সত্যটি বলেছিলাম যে যদি কোনও সি স্ট্যান্ডার্ড লাইব্রেরি ফাংশনের স্বাক্ষর restrictসি তে থাকে তবে মূল restrictশব্দটি অবশ্যই সি ++ সমমানের স্বাক্ষর থেকে সরিয়ে ফেলতে হবে।
জাস্টিন সময় - মনিকা

উত্তর:


142

মেমোরি অপ্টিমাইজেশন তার গবেষণাপত্রে, ক্রিস্টার এরিকসন বলেছেন যে যদিও restrictএটি এখনও সি ++ স্ট্যান্ডার্ডের অংশ না, এটি অনেক সংকলক দ্বারা সমর্থিত এবং তিনি যখন উপলব্ধ হন তখন এটি ব্যবহারের পরামর্শ দেন:

কীওয়ার্ড সীমাবদ্ধ করুন

! 1999 এএনএসআই / আইএসও সি স্ট্যান্ডার্ডে নতুন

! এখনও সি ++ স্ট্যান্ডার্ডে নেই তবে অনেকগুলি সি ++ কম্পাইলার দ্বারা সমর্থিত

! কেবল একটি ইঙ্গিত, তাই কিছু নাও করতে পারে এবং এখনও তা মেনে চলতে পারে

একটি সীমাবদ্ধ-যোগ্য পয়েন্টার (বা রেফারেন্স) ...

! ... মূলত সংকলককে প্রতিশ্রুতি দেয় যে পয়েন্টারের সুযোগের জন্য পয়েন্টারের লক্ষ্যমাত্রা কেবল সেই পয়েন্টারের মাধ্যমে অ্যাক্সেস করা হবে (এবং এটি থেকে পয়েন্টারগুলি অনুলিপি করা হয়)।

সি ++ সংকলকগুলিতে এটি সমর্থন করে এটি সম্ভবত সি এর মতোই আচরণ করা উচিত should

বিশদটির জন্য এই এসও পোস্টটি দেখুন: C99 'সীমাবদ্ধ' কীওয়ার্ডটির বাস্তবিক ব্যবহার?

এরিকসনের কাগজে স্কিমে আধ ঘন্টা সময় নিন, এটি আকর্ষণীয় এবং সময়সাপেক্ষ।

সম্পাদন করা

আমি এটিও দেখতে পেলাম যে আইবিএমের এআইএক্স সি / সি ++ সংকলক __restrict__কীওয়ার্ডটি সমর্থন করে

নিম্নলিখিত প্রোগ্রামটি জি ++ তে পরিষ্কারভাবে সংকলন করায় জি ++ এটিকে সমর্থন করে বলে মনে হচ্ছে:

#include <stdio.h>

int foo(int * __restrict__ a, int * __restrict__ b) {
    return *a + *b;
}

int main(void) {
    int a = 1, b = 1, c;

    c = foo(&a, &b);

    printf("c == %d\n", c);

    return 0;
}

আমি এর ব্যবহার সম্পর্কে একটি দুর্দান্ত নিবন্ধটিও পেয়েছি restrict:

সীমাবদ্ধ কীওয়ার্ডটিকে ক্ষুন্ন করা

Edit2

আমি একটি নিবন্ধ জুড়ে ছুটেছি যা বিশেষত সি ++ প্রোগ্রামগুলিতে সীমাবদ্ধতার ব্যবহার সম্পর্কে আলোচনা করে:

লোড-হিট-স্টোর এবং __ রেস্ট্রিক কীওয়ার্ড

এছাড়াও, মাইক্রোসফ্ট ভিজ্যুয়াল সি ++ কীওয়ার্ডটি সমর্থন করে__restrict


2
মেমরি অপটিমাইজেশন কাগজের লিঙ্কটি মারা গেছে, এখানে তার জিডিসির উপস্থাপনা থেকে অডিওর একটি লিঙ্ক রয়েছে। gdcvault.com/play/1022689/ স্মৃতি
Grimeh

1
@ এনমিশেল: স্পষ্টতই যদি আপনি এটি কোনও পোর্টেবল সি ++ প্রকল্পে ব্যবহার করতে চলেছেন তবে আপনার উচিত #ifndef __GNUC__ #define __restrict__ /* no-op */বা অনুরূপ। এবং এটি সংজ্ঞায়িত __restrictহলে _MSC_VERএটি সংজ্ঞায়িত করুন।
পিটার কর্ডেস

96

অন্যরা যেমন বলেছে, এর অর্থ যদি সি ++ 14 এর কিছু না হয় , তাই আসুন আমরা __restrict__জিসিসি এক্সটেনশনটি বিবেচনা করি যা সি 99 এর মতোই হয় restrict

C99

restrictবলেছেন যে দুটি পয়েন্টার ওভারল্যাপিং মেমরি অঞ্চলে নির্দেশ করতে পারে না। সর্বাধিক সাধারণ ব্যবহার হ'ল ফাংশন আর্গুমেন্টের জন্য।

এটি কীভাবে ফাংশনটি বলা যেতে পারে তা সীমাবদ্ধ করে তবে আরও সংকলন অপ্টিমাইজেশনের জন্য অনুমতি দেয়।

যদি কলার restrictচুক্তিটি অনুসরণ না করে তবে অপরিবর্তিত আচরণ।

C99 N1256 খসড়া 6.7.3 / 7 "প্রকার কোয়ালিফায়ার" বলেছেন:

সীমাবদ্ধ কোয়ালিফায়ার (যেমন রেজিস্টার স্টোরেজ ক্লাসের) এর উদ্দেশ্যযুক্ত ব্যবহারটি অপ্টিমাইজেশান প্রচার করা, এবং একটি মানানসই প্রোগ্রাম রচনা করে সমস্ত প্রিপ্রোসেসিং অনুবাদ ইউনিট থেকে বাছাইপর্বের সমস্ত উদাহরণ মুছে ফেলার অর্থ এর অর্থ পরিবর্তন হয় না (অর্থাত্ পর্যবেক্ষণযোগ্য আচরণ)।

এবং 7.7.৩.১ "সীমাবদ্ধতার আনুষ্ঠানিক সংজ্ঞা" গুরুর বিবরণ দেয়।

একটি সম্ভাব্য অপ্টিমাইজেশন

উইকিপিডিয়া উদাহরণ হয় খুব আলোকজ্জ্বল।

এটা তোলে পরিষ্কারভাবে দেখায় কিভাবে যেমন এটা এক সমাবেশ নির্দেশ সংরক্ষণ করার অনুমতি দেয়

সীমাবদ্ধ ছাড়াই:

void f(int *a, int *b, int *x) {
  *a += *x;
  *b += *x;
}

সিউডো সমাবেশ:

load R1  *x    ; Load the value of x pointer
load R2  *a    ; Load the value of a pointer
add R2 += R1    ; Perform Addition
set R2  *a     ; Update the value of a pointer
; Similarly for b, note that x is loaded twice,
; because a may be equal to x.
load R1  *x
load R2  *b
add R2 += R1
set R2  *b

সীমাবদ্ধ সহ:

void fr(int *__restrict__ a, int *__restrict__ b, int *__restrict__ x);

সিউডো সমাবেশ:

load R1  *x
load R2  *a
add R2 += R1
set R2  *a
; Note that x is not reloaded,
; because the compiler knows it is unchanged
; load R1  *x
load R2  *b
add R2 += R1
set R2  *b

জিসিসি কি আসলেই তা করে?

g++ 4.8 লিনাক্স x86-64:

g++ -g -std=gnu++98 -O0 -c main.cpp
objdump -S main.o

সাথে -O0, তারা একই।

সহ -O3:

void f(int *a, int *b, int *x) {
    *a += *x;
   0:   8b 02                   mov    (%rdx),%eax
   2:   01 07                   add    %eax,(%rdi)
    *b += *x;
   4:   8b 02                   mov    (%rdx),%eax
   6:   01 06                   add    %eax,(%rsi)  

void fr(int *__restrict__ a, int *__restrict__ b, int *__restrict__ x) {
    *a += *x;
  10:   8b 02                   mov    (%rdx),%eax
  12:   01 07                   add    %eax,(%rdi)
    *b += *x;
  14:   01 06                   add    %eax,(%rsi) 

নিরবচ্ছিন্নদের জন্য, কলিং কনভেনশনটি হ'ল:

  • rdi = প্রথম প্যারামিটার
  • rsi = দ্বিতীয় প্যারামিটার
  • rdx = তৃতীয় পরামিতি

জিসিসি আউটপুটটি উইকির নিবন্ধের চেয়ে আরও পরিষ্কার ছিল: 4 টি নির্দেশাবলী বনাম 3 নির্দেশাবলী।

অ্যারেগুলির

এখনও অবধি আমাদের একক নির্দেশনা সঞ্চয় রয়েছে, তবে পয়েন্টার যদি সাধারণ ব্যবহারের ক্ষেত্রে লুপগুলি সরিয়ে ফেলার জন্য উপস্থাপন করে তবে সুপার ক্যাট এবং মাইকেল দ্বারা উল্লিখিত নির্দেশাবলীর একগুচ্ছ সংরক্ষণ করা যেতে পারে ।

উদাহরণস্বরূপ বিবেচনা করুন:

void f(char *restrict p1, char *restrict p2, size_t size) {
     for (size_t i = 0; i < size; i++) {
         p1[i] = 4;
         p2[i] = 9;
     }
 }

কারণ restrict, একটি স্মার্ট কম্পাইলার (অথবা মানব), যে নিখুত পারে:

memset(p1, 4, size);
memset(p2, 9, size);

কোনটি সম্ভাব্যভাবে আরও কার্যকর যেহেতু এটি একটি শালীন libc বাস্তবায়নের (যেমন গ্লিবসি) অ্যাসেম্বলিটি অপ্টিমাইজড হতে পারে , পারফরম্যান্সের ক্ষেত্রে স্ট্যান্ড :: মেমকি () বা স্টাডি :: কপি () ব্যবহার করা কি আরও ভাল? , সম্ভবত সিমডি নির্দেশাবলী

সীমাবদ্ধ না করে এই অপ্টিমাইজেশানটি করা যায়নি, উদাহরণস্বরূপ বিবেচনা করুন:

char p1[4];
char *p2 = &p1[1];
f(p1, p2, 3);

তারপরে forসংস্করণটি করে:

p1 == {4, 4, 4, 9}

যখন memsetসংস্করণ তোলে:

p1 == {4, 9, 9, 9}

জিসিসি কি আসলেই তা করে?

জিসিসি 5.2.1. লিনাক্স x86-64 উবুন্টু 15.10:

gcc -g -std=c99 -O0 -c main.c
objdump -dr main.o

সঙ্গে -O0, উভয় একই।

সহ -O3:

  • সীমাবদ্ধ সহ:

    3f0:   48 85 d2                test   %rdx,%rdx
    3f3:   74 33                   je     428 <fr+0x38>
    3f5:   55                      push   %rbp
    3f6:   53                      push   %rbx
    3f7:   48 89 f5                mov    %rsi,%rbp
    3fa:   be 04 00 00 00          mov    $0x4,%esi
    3ff:   48 89 d3                mov    %rdx,%rbx
    402:   48 83 ec 08             sub    $0x8,%rsp
    406:   e8 00 00 00 00          callq  40b <fr+0x1b>
                            407: R_X86_64_PC32      memset-0x4
    40b:   48 83 c4 08             add    $0x8,%rsp
    40f:   48 89 da                mov    %rbx,%rdx
    412:   48 89 ef                mov    %rbp,%rdi
    415:   5b                      pop    %rbx
    416:   5d                      pop    %rbp
    417:   be 09 00 00 00          mov    $0x9,%esi
    41c:   e9 00 00 00 00          jmpq   421 <fr+0x31>
                            41d: R_X86_64_PC32      memset-0x4
    421:   0f 1f 80 00 00 00 00    nopl   0x0(%rax)
    428:   f3 c3                   repz retq

    memsetপ্রত্যাশা অনুযায়ী দুটি কল।

  • কোনও সীমাবদ্ধ ছাড়াই: কোনও স্টিডলিব কল নেই, কেবলমাত্র 16 টি পুনরাবৃত্তির প্রশস্ত লুপটি আন্রোলিং করছে যা আমি এখানে পুনরুত্পাদন করার উদ্দেশ্যে চাই না :-)

আমি তাদের মানদণ্ডে ধৈর্য ধরিনি, তবে আমি বিশ্বাস করি যে সীমাবদ্ধ সংস্করণটি আরও দ্রুত হবে।

কঠোর আলিয়াজিংয়ের নিয়ম

restrictমূলশব্দটি কেবল সামঞ্জস্যপূর্ণ ধরণের পয়েন্টারগুলিকেই প্রভাবিত করে (উদাহরণস্বরূপ দুটি int*) কারণ কঠোর আলিয়াজিং বিধিগুলি বলে যে অসামঞ্জস্যিত প্রকারের aliasing পূর্বনির্ধারিতভাবে সংজ্ঞায়িত আচরণ, এবং তাই সংযোজকরা ধরে নিতে পারে যে এটি ঘটে না এবং অপ্টিমাইজ করা যায় না।

দেখুন: আলিয়াসের কঠোর নিয়ম কী?

এটি কি রেফারেন্সের জন্য কাজ করে?

জিসিসি ডক্স অনুসারে এটি করে: https://gcc.gnu.org/onlinesocs/gcc-5.1.0/gcc/ সংশ্লেষযুক্ত- পয়েন্টারস html সিনট্যাক্স সহ:

int &__restrict__ rref

এমনকি thisসদস্য ফাংশনগুলির জন্য একটি সংস্করণ রয়েছে :

void T::fn () __restrict__

চমৎকার asnwer। যদি কঠোরভাবে আলিয়াজিং অক্ষম থাকে -fno-strict-aliasing, তবে restrictএকই ধরণের বা বিভিন্ন ধরণের পয়েন্টারগুলির মধ্যে কোনও পার্থক্য করা উচিত না, না? (আমি "সীমাবদ্ধ কীওয়ার্ডটি কেবল সামঞ্জস্যপূর্ণ ধরণের পয়েন্টারগুলিকেই প্রভাবিত করে")
আইডাক্ল্যাভ 463035818

@ tobi303 আমি জানি না! আপনি যদি নিশ্চিতভাবে সন্ধান করেন তবে আমাকে জানতে দিন ;-)
সিরো সান্তিলি 9 冠状 病 六四 事件 法轮功

@jww হ্যাঁ, এটি এটিকে বানানোর আরও ভাল উপায়। আপডেট করা হয়েছে।
সিরো সান্তিলি :3 冠状 病 六四 事件

restrictসি ++ এর কিছু অর্থ। আপনি যদি restrictসি ++ প্রোগ্রামের পরামিতিগুলির সাথে একটি সি লাইব্রেরি ফাংশনটি কল করেন তবে আপনাকে এর প্রভাবগুলি মেনে চলতে হবে। মূলত, যদি restrictকোনও সি লাইব্রেরি এপিআইতে ব্যবহৃত হয় তবে এর অর্থ লিস্পের ডায়নামিক এফএফআই সহ যে কোনও ভাষা থেকে যে কেউ তাকে ডাকছেন।
কাজ

22

কিছুই নেই। এটি সি 99 স্ট্যান্ডার্ডে যুক্ত হয়েছিল।


8
এটি সম্পূর্ণ সত্য নয়। স্পষ্টতই এটি কিছু সি ++ সংকলক দ্বারা সমর্থিত এবং কিছু লোক যখন এটি উপলব্ধ থাকে তখন এটির ব্যবহারের জন্য দৃ strongly়ভাবে সুপারিশ করে, নীচে আমার উত্তরটি দেখুন।
রবার্ট এস বার্নেস

18
@ রবার্ট এস বার্নেস: সি ++ স্ট্যান্ডার্ড কোনও restrictকীওয়ার্ড হিসাবে স্বীকৃতি দেয় না । সুতরাং আমার উত্তর সঠিক দাঁড়িয়েছে। আপনি যা বর্ণনা করেছেন তা হ'ল বাস্তবায়ন নির্দিষ্ট আচরণ এবং এমন কিছু যা আপনার সত্যিকার অর্থে নির্ভর করা উচিত নয়
dirkgently

26
@ নির্দ্বিধায়: সমস্ত প্রাপ্য সম্মানের সাথে, কেন নয়? অনেকগুলি প্রকল্প কেবল নির্দিষ্ট বা খুব কম সংকলক দ্বারা সমর্থিত নির্দিষ্ট অ-মানক ভাষার এক্সটেনশনের সাথে যুক্ত। লিনাক্স কার্নেল এবং জিসিসি মনে আসে। কোনও নির্দিষ্ট সংকলক বা কোনও প্রকল্পের পুরো কার্যকালের জন্য নির্দিষ্ট সংকলকটির একটি নির্দিষ্ট সংশোধন সহকারে বেঁচে থাকা অস্বাভাবিক নয়। প্রতিটি প্রোগ্রাম কঠোরভাবে মেনে চলার প্রয়োজন হয় না।
রবার্ট এস বার্নেস

7
@ আরপবার্ট এস বার্নেস: আপনার সম্ভবত নির্দিষ্ট আচরণের উপর নির্ভর করা উচিত নয় কেন আমি সম্ভবত আর কোনও চাপ দিতে পারি না। লিনাক্স এবং জিসিসি-র কথা চিন্তা করুন এবং আপনি দেখতে পাবেন যে তারা কেন আপনার প্রতিরক্ষায় ভাল উদাহরণ নয়। আমি এখনও তার আজীবন একক সংকলক সংস্করণে চালিত একটি মাঝারি সফল সফটওয়্যার দেখতে পেলাম ।
নির্বিঘ্নে

16
@ আরপিবার্ট এস বার্নেস: প্রশ্নটি সি ++ বলেছে। এমএসভিসি নয়, জিসিসি নয়, এআইএক্স নয়। যদি অ্যাসিডজম্বি 24 নির্দিষ্ট সংযোজন সংকলক চেয়েছিল তবে তার উচিত ছিল / ট্যাগ করা উচিত।
কিটসুনওয়াইএমজি

12

এই মূল শব্দটি যুক্ত করার মূল প্রস্তাবনা। যদিও নির্লিপ্তভাবে উল্লেখ করা হয়েছে, এটি একটি C99 বৈশিষ্ট্য; সি ++ এর সাথে এর কোনও যোগসূত্র নেই।


5
অনেক সি ++ সংকলক __restrict__কীওয়ার্ডটি সমর্থন করে যা আমি যতদূর বলতে পারি অভিন্ন।
রবার্ট এস বার্নেস

এটি সি ++ এর সাথে সম্পর্কিত যা কিছু আছে, কারণ সি ++ প্রোগ্রামগুলি সি লাইব্রেরিগুলিতে কল করে এবং সি লাইব্রেরি ব্যবহার করে restrict। সি ++ প্রোগ্রামের আচরণটি নির্ধারিত বিধিনিষেধগুলিকে লঙ্ঘন করলে অপরিজ্ঞাত হয়ে যায় restrict
কাজ

@ kaz সম্পূর্ণ ভুল। এটি সি ++ এর সাথে কিছুই করার নেই কারণ এটি সি ++ এর কোনও কীওয়ার্ড বা বৈশিষ্ট্য নয় এবং আপনি যদি সি ++ এ সি হেডার ফাইলগুলি ব্যবহার করেন তবে আপনাকে অবশ্যই restrictকীওয়ার্ডটি মুছে ফেলতে হবে । অবশ্যই যদি আপনি কোনও সি ফাংশনে অ্যালাইজড পয়েন্টারগুলি পাস করেন যা তাদেরকে সীমাবদ্ধ ঘোষণা করে (যা আপনি সি ++ বা সি থেকে যে কোনওটি করতে পারেন) তবে এটি অপরিবর্তিত, তবে এটি আপনার পক্ষে।
জিম বাল্টার

@ জিমবাল্টার আমি দেখতে পাচ্ছি, তাই আপনি যা বলছেন তা হ'ল সি ++ প্রোগ্রামগুলি সি লাইব্রেরিগুলিতে কল করে এবং সি লাইব্রেরি ব্যবহার করে restrict। সীমাবদ্ধতার দ্বারা আবদ্ধ নিষেধাজ্ঞাগুলি লঙ্ঘন করলে সি ++ প্রোগ্রামের আচরণ অপরিজ্ঞাত হয়ে যায়। তবে এটির আসলে সি ++ এর সাথে কোনও সম্পর্ক নেই, কারণ এটি "আপনার উপর"।
কাজ

5

সি ++ তে এই জাতীয় কোনও কীওয়ার্ড নেই। সি ++ কীওয়ার্ডগুলির তালিকা সি ++ ভাষার মানদণ্ডের 2.11 / 1 বিভাগে পাওয়া যাবে। restrictসি ভাষার C99 সংস্করণে একটি কীওয়ার্ড এবং সি ++ এ নয়।


5
অনেক সি ++ সংকলক __restrict__কীওয়ার্ডটি সমর্থন করে যা আমি যতদূর বলতে পারি অভিন্ন।
রবার্ট এস বার্নেস

17
@ রবার্ট: তবে সি ++ তে তেমন কোনও কীওয়ার্ড নেই । পৃথক সংকলকগণ যা করেন তা তাদের নিজস্ব ব্যবসা, তবে এটি সি ++ ভাষার অংশ নয়।
জাল্ফ

4

যেহেতু কয়েকটি সি লাইব্রেরির হেডার ফাইলগুলি কীওয়ার্ডটি ব্যবহার করে, তাই সি ++ ভাষা সম্পর্কে কিছু করতে হবে .. সর্বনিম্ন কীওয়ার্ডটি উপেক্ষা করে, তাই কীওয়ার্ডটি দমন করতে আমাদের একটি ফাঁকা ম্যাক্রোতে কীওয়ার্ডটি # সংজ্ঞায়িত করতে হবে না ।


3
আমি অনুমান করব যে তা হয় extern Cঘোষণার সাহায্যে পরিচালিত হয়েছে , বা এটি নিঃশব্দে বাদ দেওয়া হয়েছে, যেমন এআইএক্স সি / সি ++ সংকলকটির ক্ষেত্রে, যা পরিবর্তে __rerstrict__কীওয়ার্ডটি পরিচালনা করে । সেই কীওয়ার্ডটিও জিসিসির আওতায় সমর্থিত যাতে কোডটি জি ++ এর অধীনে একই সংকলন করে।
রবার্ট এস বার্নেস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.