code: func (d *Decoder) AllocString() {
  	d.sdata = string(d.data)
  	d.usestring = true
  }
docs: // AllocString pre-allocates a string version of the data before starting
  // to decode the data.
  // It is used to make the decode operation faster(see below) by doing one
  // allocation operation for string conversion(from bytes), and then uses
  // "slicing" to create non-escaped strings in the "Decoder.string" method.
  // However, string is a read-only slice, and since the slice references the
  // original array, as long as the slice is kept around, the garbage collector
  // can't release the array.
  // For this reason, you want to use this method only when the Decoder's result
  // is a "read-only" or you are adding more elements to it. see example below.
  //
  // Here are the improvements:
  //
  //	small payload  - 0.13~ time faster, does 0.45~ less memory allocations but
  // 			 the total number of bytes that are allocated is 0.03~ bigger
  //
  // 	medium payload - 0.16~ time faster, does 0.5~ less memory allocations but
  // 			 the total number of bytes that are allocated is 0.05~ bigger
  //
  // 	large payload  - 0.13~ time faster, does 0.50~ less memory allocations but
  // 			 the total number of bytes that are allocated is 0.02~ bigger
  //
  // Here is an example to illustrate when you don't want to use this method
  //
  // 	str := fmt.Sprintf(`{"foo": "bar", "baz": "%s"}`, strings.Repeat("#", 1024 * 1024))
  //	dec := djson.NewDecoder([]byte(str))
  // 	dec.AllocString()
  // 	ev, err := dec.DecodeObject()
  //
  // 	// inpect memory stats here; MemStats.Alloc ~= 1M
  //
  // 	delete(ev, "baz") // or ev["baz"] = "qux"
  //
  // 	// inpect memory stats again; MemStats.Alloc ~= 1M
  // 	// it means that the chunk that was located in the "baz" value is not freed
  //