Improve C++ vector deserialization

Summary: Use std::vector::resize() method to default construct placeholder elements. Then grab references via operator[] to deserialize directly into the vector, instead of copy-constructing elements in.

Reviewed By: hzhao

Test Plan: test/cpp contains list serialization/deserialization checks


git-svn-id: https://svn.apache.org/repos/asf/incubator/thrift/trunk@665449 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/compiler/cpp/src/generate/t_cpp_generator.cc b/compiler/cpp/src/generate/t_cpp_generator.cc
index 2518509..755fbb5 100644
--- a/compiler/cpp/src/generate/t_cpp_generator.cc
+++ b/compiler/cpp/src/generate/t_cpp_generator.cc
@@ -2261,7 +2261,8 @@
     out <<
       indent() << "facebook::thrift::protocol::TType " << etype << ";" << endl <<
       indent() << "iprot->readListBegin(" <<
-                   etype << ", " << size << ");" << endl;
+      etype << ", " << size << ");" << endl <<
+      indent() << prefix << ".resize(" << size << ");";
   }
 
 
@@ -2278,7 +2279,7 @@
     } else if (ttype->is_set()) {
       generate_deserialize_set_element(out, (t_set*)ttype, prefix);
     } else if (ttype->is_list()) {
-      generate_deserialize_list_element(out, (t_list*)ttype, prefix);
+      generate_deserialize_list_element(out, (t_list*)ttype, prefix, i);
     }
 
     scope_down(out);
@@ -2335,17 +2336,10 @@
 
 void t_cpp_generator::generate_deserialize_list_element(ofstream& out,
                                                         t_list* tlist,
-                                                        string prefix) {
-  string elem = tmp("_elem");
-  t_field felem(tlist->get_elem_type(), elem);
-
-  indent(out) <<
-    declare_field(&felem) << endl;
-
+                                                        string prefix,
+                                                        string index) {
+  t_field felem(tlist->get_elem_type(), prefix + "[" + index + "]");
   generate_deserialize_field(out, &felem);
-
-  indent(out) <<
-    prefix << ".push_back(" << elem << ");" << endl;
 }
 
 
diff --git a/compiler/cpp/src/generate/t_cpp_generator.h b/compiler/cpp/src/generate/t_cpp_generator.h
index ba19c1c..e737d30 100644
--- a/compiler/cpp/src/generate/t_cpp_generator.h
+++ b/compiler/cpp/src/generate/t_cpp_generator.h
@@ -108,7 +108,8 @@
 
   void generate_deserialize_list_element (std::ofstream& out,
                                           t_list*     tlist,
-                                          std::string prefix="");
+                                          std::string prefix,
+                                          std::string index);
 
   void generate_serialize_field          (std::ofstream& out,
                                           t_field*    tfield,