亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? library_3.html

?? linux_c函數(shù),linux下編程必備的
?? HTML
?? 第 1 頁 / 共 5 頁
字號(hào):
<P>
<PRE>
obstack_free (obstack_ptr, first_object_allocated_ptr);
</PRE>
<P>
Recall that the objects in an obstack are grouped into chunks.  When all
the objects in a chunk become free, the obstack library automatically
frees the chunk (see section <A HREF="library_3.html#SEC35" tppabs="http://www.cs.utah.edu/dept/old/texinfo/glibc-manual-0.02/library_3.html#SEC35">Preparing for Using Obstacks</A>).  Then other
obstacks, or non-obstack allocation, can reuse the space of the chunk.
<P>
<A NAME="IDX182"></A>
<H3><A NAME="SEC38" HREF="library_toc.html#SEC38" tppabs="http://www.cs.utah.edu/dept/old/texinfo/glibc-manual-0.02/library_toc.html#SEC38">Obstack Functions and Macros</A></H3>
<P>
The interfaces for using obstacks may be defined either as functions or
as macros, depending on the compiler.  The obstack facility works with
all C compilers, including both ANSI C and traditional C, but there are
precautions you must take if you plan to use compilers other than GNU C.
<P>
If you are using an old-fashioned non-ANSI C compiler, all the obstack
"functions" are actually defined only as macros.  You can call these
macros like functions, but you cannot use them in any other way (for
example, you cannot take their address).
<P>
Calling the macros requires a special precaution: namely, the first
operand (the obstack pointer) may not contain any side effects, because
it may be computed more than once.  For example, if you write this:
<P>
<PRE>
obstack_alloc (get_obstack (), 4);
</PRE>
<P>
you will find that <CODE>get_obstack</CODE> may be called several times.
If you use <CODE>*obstack_list_ptr++</CODE> as the obstack pointer argument,
you will get very strange results since the incrementation may occur
several times.
<P>
In ANSI C, each function has both a macro definition and a function
definition.  The function definition is used if you take the address of the
function without calling it.  An ordinary call uses the macro definition by
default, but you can request the function definition instead by writing the
function name in parentheses, as shown here:
<P>
<PRE>
char *x;
void *(*funcp) ();
/* Use the macro.  */
x = (char *) obstack_alloc (obptr, size);
/* Call the function.  */
x = (char *) (obstack_alloc) (obptr, size);
/* Take the address of the function.  */
funcp = obstack_alloc;
</PRE>
<P>
This is the same situation that exists in ANSI C for the standard library
functions.  See section <A HREF="library_1.html#SEC10" tppabs="http://www.cs.utah.edu/dept/old/texinfo/glibc-manual-0.02/library_1.html#SEC10">Macro Definitions of Functions</A>.
<P>
<STRONG>Warning:</STRONG> When you do use the macros, you must observe the
precaution of avoiding side effects in the first operand, even in ANSI
C.
<P>
If you use the GNU C compiler, this precaution is not necessary, because
various language extensions in GNU C permit defining the macros so as to
compute each argument only once.
<P>
<A NAME="IDX183"></A>
<A NAME="IDX184"></A>
<H3><A NAME="SEC39" HREF="library_toc.html#SEC39" tppabs="http://www.cs.utah.edu/dept/old/texinfo/glibc-manual-0.02/library_toc.html#SEC39">Growing Objects</A></H3>
<P>
Because storage in obstack chunks is used sequentially, it is possible to
build up an object step by step, adding one or more bytes at a time to the
end of the object.  With this technique, you do not need to know how much
data you will put in the object until you come to the end of it.  We call
this the technique of <DFN>growing objects</DFN>.  The special functions
for adding data to the growing object are described in this section.
<P>
You don't need to do anything special when you start to grow an object.
Using one of the functions to add data to the object automatically
starts it.  However, it is necessary to say explicitly when the object is
finished.  This is done with the function <CODE>obstack_finish</CODE>.
<P>
The actual address of the object thus built up is not known until the
object is finished.  Until then, it always remains possible that you will
add so much data that the object must be copied into a new chunk.
<P>
While the obstack is in use for a growing object, you cannot use it for
ordinary allocation of another object.  If you try to do so, the space
already added to the growing object will become part of the other object.
<P>
<A NAME="IDX185"></A>
<U>Function:</U> void <B>obstack_blank</B> <I>(struct obstack *<VAR>obstack_ptr</VAR>, size_t <VAR>size</VAR>)</I><P>
The most basic function for adding to a growing object is
<CODE>obstack_blank</CODE>, which adds space without initializing it.
<P>
<A NAME="IDX186"></A>
<U>Function:</U> void <B>obstack_grow</B> <I>(struct obstack *<VAR>obstack_ptr</VAR>, void *<VAR>data</VAR>, size_t <VAR>size</VAR>)</I><P>
To add a block of initialized space, use <CODE>obstack_grow</CODE>, which is
the growing-object analogue of <CODE>obstack_copy</CODE>.  It adds <VAR>size</VAR>
bytes of data to the growing object, copying the contents from
<VAR>data</VAR>.
<P>
<A NAME="IDX187"></A>
<U>Function:</U> void <B>obstack_grow0</B> <I>(struct obstack *<VAR>obstack_ptr</VAR>, void *<VAR>data</VAR>, size_t <VAR>size</VAR>)</I><P>
This is the growing-object analogue of <CODE>obstack_copy0</CODE>.  It adds
<VAR>size</VAR> bytes copied from <VAR>data</VAR>, followed by an additional null
character.
<P>
<A NAME="IDX188"></A>
<U>Function:</U> void <B>obstack_1grow</B> <I>(struct obstack *<VAR>obstack_ptr</VAR>, char <VAR>c</VAR>)</I><P>
To add one character at a time, use the function <CODE>obstack_1grow</CODE>.
It adds a single byte containing <VAR>c</VAR> to the growing object.
<P>
<A NAME="IDX189"></A>
<U>Function:</U> void * <B>obstack_finish</B> <I>(struct obstack *<VAR>obstack_ptr</VAR>)</I><P>
When you are finished growing the object, use the function
<CODE>obstack_finish</CODE> to close it off and return its final address.
<P>
Once you have finished the object, the obstack is available for ordinary
allocation or for growing another object.
<P>
When you build an object by growing it, you will probably need to know
afterward how long it became.  You need not keep track of this as you grow
the object, because you can find out the length from the obstack just
before finishing the object with the function <CODE>obstack_object_size</CODE>,
declared as follows:
<P>
<A NAME="IDX190"></A>
<U>Function:</U> size_t <B>obstack_object_size</B> <I>(struct obstack *<VAR>obstack_ptr</VAR>)</I><P>
This function returns the current size of the growing object, in bytes.
Remember to call this function <EM>before</EM> finishing the object.
After it is finished, <CODE>obstack_object_size</CODE> will return zero.
<P>
If you have started growing an object and wish to cancel it, you should
finish it and then free it, like this:
<P>
<PRE>
obstack_free (obstack_ptr, obstack_finish (obstack_ptr));
</PRE>
<P>
This has no effect if no object was growing.
<A NAME="IDX191"></A>
<P>
You can use <CODE>obstack_blank</CODE> with a negative size argument to make
the current object smaller.  Just don't try to shrink it beyond zero
length--there's no telling what will happen if you do that.
<P>
<A NAME="IDX192"></A>
<H3><A NAME="SEC40" HREF="library_toc.html#SEC40" tppabs="http://www.cs.utah.edu/dept/old/texinfo/glibc-manual-0.02/library_toc.html#SEC40">Extra Fast Growing Objects</A></H3>
<P>
The usual functions for growing objects incur overhead for checking
whether there is room for the new growth in the current chunk.  If you
are frequently constructing objects in small steps of growth, this
overhead can be significant.
<P>
You can reduce the overhead by using special "fast growth"
functions that grow the object without checking.  In order to have a
robust program, you must do the checking yourself.  If you do this checking
in the simplest way each time you are about to add data to the object, you
have not saved anything, because that is what the ordinary growth
functions do.  But if you can arrange to check less often, or check
more efficiently, then you make the program faster.
<P>
The function <CODE>obstack_room</CODE> returns the amount of room available
in the current chunk.  It is declared as follows:
<P>
<A NAME="IDX193"></A>
<U>Function:</U> size_t <B>obstack_room</B> <I>(struct obstack *<VAR>obstack_ptr</VAR>)</I><P>
This returns the number of bytes that can be added safely to the current
growing object (or to an object about to be started) in obstack
<VAR>obstack</VAR> using the fast growth functions.
<P>
While you know there is room, you can use these fast growth functions
for adding data to a growing object:
<P>
<A NAME="IDX194"></A>
<U>Function:</U> void <B>obstack_1grow_fast</B> <I>(struct obstack *<VAR>obstack_ptr</VAR>, char <VAR>c</VAR>)</I><P>
The function <CODE>obstack_1grow_fast</CODE> adds one byte containing the
character <VAR>c</VAR> to the growing object in obstack <VAR>obstack_ptr</VAR>.
<P>
<A NAME="IDX195"></A>
<U>Function:</U> void <B>obstack_blank_fast</B> <I>(struct obstack *<VAR>obstack_ptr</VAR>, size_t <VAR>size</VAR>)</I><P>
The function <CODE>obstack_blank_fast</CODE> adds <VAR>size</VAR> bytes to the
growing object in obstack <VAR>obstack_ptr</VAR> without initializing them.
<P>
When you check for space using <CODE>obstack_room</CODE> and there is not
enough room for what you want to add, the fast growth functions
are not safe.  In this case, simply use the corresponding ordinary
growth function instead.  Very soon this will copy the object to a
new chunk; then there will be lots of room available again. 
<P>
So, each time you use an ordinary growth function, check afterward for
sufficient space using <CODE>obstack_room</CODE>.  Once the object is copied
to a new chunk, there will be plenty of space again, so the program will
start using the fast growth functions again.
<P>
Here is an example:
<P>
<PRE>
void
add_string (struct obstack *obstack, char *ptr, size_t len)
{
  while (len &#62; 0)
    {
      if (obstack_room (obstack) &#62; len)
        {
          /* We have enough room: add everything fast.  */
          while (len-- &#62; 0)
            obstack_1grow_fast (obstack, *ptr++);
        }
      else
        {
          /* Not enough room. Add one character slowly,
             which may copy to a new chunk and make room.  */
          obstack_1grow (obstack, *ptr++);
          len--;
        }
    }
}
</PRE>
<P>
<A NAME="IDX196"></A>
<A NAME="IDX197"></A>
<H3><A NAME="SEC41" HREF="library_toc.html#SEC41" tppabs="http://www.cs.utah.edu/dept/old/texinfo/glibc-manual-0.02/library_toc.html#SEC41">Status of an Obstack</A></H3>
<P>
Here are functions that provide information on the current status of
allocation in an obstack.  You can use them to learn about an object while
still growing it.
<P>
<A NAME="IDX198"></A>
<U>Function:</U> void * <B>obstack_base</B> <I>(struct obstack *<VAR>obstack_ptr</VAR>)</I><P>
This function returns the tentative address of the beginning of the
currently growing object in <VAR>obstack_ptr</VAR>.  If you finish the object
immediately, it will have that address.  If you make it larger first, it
may outgrow the current chunk--then its address will change!
<P>
If no object is growing, this value says where the next object you
allocate will start (once again assuming it fits in the current
chunk).
<P>
<A NAME="IDX199"></A>
<U>Function:</U> void * <B>obstack_next_free</B> <I>(struct obstack *<VAR>obstack_ptr</VAR>)</I><P>
This function returns the address of the first free byte in the current
chunk of obstack <VAR>obstack_ptr</VAR>.  This is the end of the currently
growing object.  If no object is growing, <CODE>obstack_next_free</CODE>
returns the same value as <CODE>obstack_base</CODE>.
<P>
<A NAME="IDX200"></A>
<U>Function:</U> size_t <B>obstack_object_size</B> <I>(struct obstack *<VAR>obstack_ptr</VAR>)</I><P>
This function returns the size in bytes of the currently growing object.
This is equivalent to
<P>
<PRE>
obstack_next_free (<VAR>obstack_ptr</VAR>) - obstack_base (<VAR>obstack_ptr</VAR>)
</PRE>
<P>
<A NAME="IDX201"></A>
<H3><A NAME="SEC42" HREF="library_toc.html#SEC42" tppabs="http://www.cs.utah.edu/dept/old/texinfo/glibc-manual-0.02/library_toc.html#SEC42">Alignment of Data in Obstacks</A></H3>
<P>
Each obstack has an <DFN>alignment boundary</DFN>; each object allocated in

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
91精品国产一区二区三区| 亚洲女性喷水在线观看一区| 欧美日韩国产高清一区二区三区 | 欧美一级一级性生活免费录像| 色综合久久综合中文综合网| 99精品热视频| 99国产精品久久久| 99精品桃花视频在线观看| 不卡免费追剧大全电视剧网站| 处破女av一区二区| 99久久精品99国产精品 | 国产精品乱码妇女bbbb| 久久久精品国产免大香伊 | 日日欢夜夜爽一区| 日本亚洲一区二区| 精品写真视频在线观看| 国产在线国偷精品产拍免费yy| 国产酒店精品激情| hitomi一区二区三区精品| 97久久超碰国产精品电影| 91麻豆视频网站| 欧美性生交片4| 日韩一级在线观看| 久久亚洲欧美国产精品乐播| 欧美韩国一区二区| 亚洲乱码精品一二三四区日韩在线| 一区二区三区产品免费精品久久75 | 中文幕一区二区三区久久蜜桃| 中文无字幕一区二区三区| 日韩美女久久久| 午夜在线成人av| 国产伦精一区二区三区| 成人国产一区二区三区精品| 欧美伊人久久大香线蕉综合69| 欧美日韩一区三区| 337p粉嫩大胆噜噜噜噜噜91av| 国产精品欧美久久久久一区二区| 一区二区在线电影| 老司机免费视频一区二区三区| 国产99久久久精品| 欧美三级电影精品| 久久久高清一区二区三区| 亚洲男人的天堂网| 免费观看一级欧美片| 成人一区二区三区视频在线观看| 欧美在线观看视频在线| 日韩精品一区二区三区在线 | 久久久久国产一区二区三区四区| 国产精品久久99| 亚洲不卡在线观看| 成人小视频免费在线观看| 久久国内精品视频| 亚洲影院理伦片| 国产一级精品在线| 91国产福利在线| 久久精品人人做| 婷婷夜色潮精品综合在线| 成人一级片网址| 日韩一卡二卡三卡国产欧美| 日韩理论在线观看| 国产真实乱对白精彩久久| 在线观看日韩毛片| 国产亚洲精品精华液| 日韩黄色一级片| 91尤物视频在线观看| 精品国产伦一区二区三区观看方式 | 亚洲人成网站精品片在线观看 | 91亚洲精品久久久蜜桃| 欧美成人乱码一区二区三区| 亚洲综合区在线| 成人高清视频免费观看| 日韩欧美电影一区| 亚洲一区二区av在线| 成人黄色免费短视频| 欧美精品一区二区在线播放| 亚洲超碰97人人做人人爱| 91无套直看片红桃| 国产亚洲女人久久久久毛片| 美女视频黄久久| 欧美女孩性生活视频| 亚洲另类在线一区| 成人激情午夜影院| 国产偷国产偷亚洲高清人白洁| 天天综合色天天| 欧美艳星brazzers| 亚洲精品少妇30p| www.成人网.com| 久久久亚洲精品一区二区三区| 日本成人在线网站| 欧美日韩一区高清| 亚洲一级不卡视频| 在线精品视频免费观看| 亚洲视频免费在线| 99综合影院在线| 中文字幕国产一区二区| 国产成人激情av| 国产亚洲成年网址在线观看| 国产在线视频精品一区| 精品伦理精品一区| 国内外成人在线视频| 精品日本一线二线三线不卡| 蜜桃久久久久久久| 日韩欧美在线123| 久久精品国产第一区二区三区| 51精品久久久久久久蜜臀| 天天影视色香欲综合网老头| 欧美精品国产精品| 视频在线观看91| 日韩欧美国产综合| 狠狠色丁香久久婷婷综| 久久久久久亚洲综合影院红桃| 国产综合色视频| 日本一区二区三区久久久久久久久不 | 亚洲摸摸操操av| 欧美伊人久久久久久午夜久久久久| 一区二区三区四区中文字幕| 91国内精品野花午夜精品| 亚洲综合激情网| 制服丝袜在线91| 麻豆精品国产传媒mv男同| 337p粉嫩大胆噜噜噜噜噜91av| 国产乱码精品1区2区3区| 国产精品污污网站在线观看| 色综合天天天天做夜夜夜夜做| 亚洲综合激情另类小说区| 欧美丰满一区二区免费视频| 蜜桃一区二区三区四区| 久久久精品综合| 99久久久久久99| 午夜视黄欧洲亚洲| 久久综合色鬼综合色| 成人精品一区二区三区四区| 亚洲免费av高清| 7777女厕盗摄久久久| 国内精品伊人久久久久av一坑| 欧美国产视频在线| 欧美性xxxxx极品少妇| 青青草国产成人99久久| 国产日韩精品视频一区| 一本色道久久综合精品竹菊 | 欧美色男人天堂| 国产在线精品视频| 亚洲精品国产成人久久av盗摄 | 欧美精品vⅰdeose4hd| 狠狠色丁香婷婷综合| 亚洲人123区| 欧美第一区第二区| 99热在这里有精品免费| 日韩和欧美的一区| 国产精品久久久久久久午夜片| 欧美丝袜丝nylons| 国产精品资源在线观看| 一区二区高清免费观看影视大全| 日韩免费看的电影| 91免费在线看| 国产一区二区三区黄视频 | 69久久99精品久久久久婷婷| 国产成人亚洲综合a∨婷婷| 亚洲一区免费观看| 久久中文字幕电影| 欧美三级电影网站| 成人免费视频caoporn| 日本怡春院一区二区| 欧美一区二区久久久| 久久爱www久久做| 夜夜精品浪潮av一区二区三区| 精品国产免费一区二区三区四区 | 午夜精彩视频在线观看不卡| 国产欧美视频一区二区| 91精品国产乱码久久蜜臀| eeuss鲁一区二区三区| 麻豆91在线播放免费| 亚洲理论在线观看| 久久精品人人做人人爽人人| 欧美一区二区三区播放老司机| 91在线免费看| 国产电影精品久久禁18| 日韩激情一二三区| 夜夜嗨av一区二区三区网页| 欧美激情在线看| 欧美第一区第二区| 91 com成人网| 欧美日韩一级片网站| 91影视在线播放| 成人av综合在线| 国产麻豆成人传媒免费观看| 日本不卡一区二区三区高清视频| 一区二区三区四区国产精品| 中文在线一区二区| 久久久精品天堂| 精品国产伦一区二区三区观看方式 | 欧美午夜精品免费| 91美女蜜桃在线| 97精品视频在线观看自产线路二| 国产传媒久久文化传媒| 国产在线视频不卡二| 精品一区二区免费看| 美女尤物国产一区| 日本最新不卡在线| 丝袜美腿高跟呻吟高潮一区|