Best way to implement 2D array on heap
I have been working on C++ and I was recently told that I was making 2D arrays on the heap wrong. I have always done it this way:
int **array1 = new int*[200];
for (int i = 0; i < 200; ++i)
{
array1[i] = new int[200];
}
I was told that this was the better way:
int(*ptr)[200] = new int[200][200];
However the person explaining it to me was not able to explain it well as to why one is better then the other. I was hoping someone here would tell me why one would be better then the other?
c++
|
show 1 more comment
I have been working on C++ and I was recently told that I was making 2D arrays on the heap wrong. I have always done it this way:
int **array1 = new int*[200];
for (int i = 0; i < 200; ++i)
{
array1[i] = new int[200];
}
I was told that this was the better way:
int(*ptr)[200] = new int[200][200];
However the person explaining it to me was not able to explain it well as to why one is better then the other. I was hoping someone here would tell me why one would be better then the other?
c++
1
Is there a reason you can't use anstd::vector
orstd::array
?
– scohe001
Nov 26 '18 at 22:39
I would in most cases but I just was wondering why one be better then the other if for some reason you were forced.
– xxcellerator
Nov 26 '18 at 22:40
1
The second only makes one allocation, so it'll be faster at runtime. Might even be drastically faster in multi-threaded code with a single thread allocator. Though neither are something you should ever really find yourself writing unless using a legacy system.
– George
Nov 26 '18 at 22:43
1
int(*ptr)[200] = new int[200][200];
only works if you know the second dimension at compile time. Instead I suggest a simple matrix class.
– user4581301
Nov 26 '18 at 22:57
Here's an article why you should reduce the number of calls to dynamic memory (on windows) randomascii.wordpress.com/2014/12/10/… If you're not planning on freeing all of the elements at the same time, you could go towards fragmentation. If you're planning on freeing all of the elements at the same time, you're probably better off using the "better way* structure to be more clear about your intentions.
– GandhiGandhi
Nov 27 '18 at 0:27
|
show 1 more comment
I have been working on C++ and I was recently told that I was making 2D arrays on the heap wrong. I have always done it this way:
int **array1 = new int*[200];
for (int i = 0; i < 200; ++i)
{
array1[i] = new int[200];
}
I was told that this was the better way:
int(*ptr)[200] = new int[200][200];
However the person explaining it to me was not able to explain it well as to why one is better then the other. I was hoping someone here would tell me why one would be better then the other?
c++
I have been working on C++ and I was recently told that I was making 2D arrays on the heap wrong. I have always done it this way:
int **array1 = new int*[200];
for (int i = 0; i < 200; ++i)
{
array1[i] = new int[200];
}
I was told that this was the better way:
int(*ptr)[200] = new int[200][200];
However the person explaining it to me was not able to explain it well as to why one is better then the other. I was hoping someone here would tell me why one would be better then the other?
c++
c++
asked Nov 26 '18 at 22:37
xxcelleratorxxcellerator
133
133
1
Is there a reason you can't use anstd::vector
orstd::array
?
– scohe001
Nov 26 '18 at 22:39
I would in most cases but I just was wondering why one be better then the other if for some reason you were forced.
– xxcellerator
Nov 26 '18 at 22:40
1
The second only makes one allocation, so it'll be faster at runtime. Might even be drastically faster in multi-threaded code with a single thread allocator. Though neither are something you should ever really find yourself writing unless using a legacy system.
– George
Nov 26 '18 at 22:43
1
int(*ptr)[200] = new int[200][200];
only works if you know the second dimension at compile time. Instead I suggest a simple matrix class.
– user4581301
Nov 26 '18 at 22:57
Here's an article why you should reduce the number of calls to dynamic memory (on windows) randomascii.wordpress.com/2014/12/10/… If you're not planning on freeing all of the elements at the same time, you could go towards fragmentation. If you're planning on freeing all of the elements at the same time, you're probably better off using the "better way* structure to be more clear about your intentions.
– GandhiGandhi
Nov 27 '18 at 0:27
|
show 1 more comment
1
Is there a reason you can't use anstd::vector
orstd::array
?
– scohe001
Nov 26 '18 at 22:39
I would in most cases but I just was wondering why one be better then the other if for some reason you were forced.
– xxcellerator
Nov 26 '18 at 22:40
1
The second only makes one allocation, so it'll be faster at runtime. Might even be drastically faster in multi-threaded code with a single thread allocator. Though neither are something you should ever really find yourself writing unless using a legacy system.
– George
Nov 26 '18 at 22:43
1
int(*ptr)[200] = new int[200][200];
only works if you know the second dimension at compile time. Instead I suggest a simple matrix class.
– user4581301
Nov 26 '18 at 22:57
Here's an article why you should reduce the number of calls to dynamic memory (on windows) randomascii.wordpress.com/2014/12/10/… If you're not planning on freeing all of the elements at the same time, you could go towards fragmentation. If you're planning on freeing all of the elements at the same time, you're probably better off using the "better way* structure to be more clear about your intentions.
– GandhiGandhi
Nov 27 '18 at 0:27
1
1
Is there a reason you can't use an
std::vector
or std::array
?– scohe001
Nov 26 '18 at 22:39
Is there a reason you can't use an
std::vector
or std::array
?– scohe001
Nov 26 '18 at 22:39
I would in most cases but I just was wondering why one be better then the other if for some reason you were forced.
– xxcellerator
Nov 26 '18 at 22:40
I would in most cases but I just was wondering why one be better then the other if for some reason you were forced.
– xxcellerator
Nov 26 '18 at 22:40
1
1
The second only makes one allocation, so it'll be faster at runtime. Might even be drastically faster in multi-threaded code with a single thread allocator. Though neither are something you should ever really find yourself writing unless using a legacy system.
– George
Nov 26 '18 at 22:43
The second only makes one allocation, so it'll be faster at runtime. Might even be drastically faster in multi-threaded code with a single thread allocator. Though neither are something you should ever really find yourself writing unless using a legacy system.
– George
Nov 26 '18 at 22:43
1
1
int(*ptr)[200] = new int[200][200];
only works if you know the second dimension at compile time. Instead I suggest a simple matrix class.– user4581301
Nov 26 '18 at 22:57
int(*ptr)[200] = new int[200][200];
only works if you know the second dimension at compile time. Instead I suggest a simple matrix class.– user4581301
Nov 26 '18 at 22:57
Here's an article why you should reduce the number of calls to dynamic memory (on windows) randomascii.wordpress.com/2014/12/10/… If you're not planning on freeing all of the elements at the same time, you could go towards fragmentation. If you're planning on freeing all of the elements at the same time, you're probably better off using the "better way* structure to be more clear about your intentions.
– GandhiGandhi
Nov 27 '18 at 0:27
Here's an article why you should reduce the number of calls to dynamic memory (on windows) randomascii.wordpress.com/2014/12/10/… If you're not planning on freeing all of the elements at the same time, you could go towards fragmentation. If you're planning on freeing all of the elements at the same time, you're probably better off using the "better way* structure to be more clear about your intentions.
– GandhiGandhi
Nov 27 '18 at 0:27
|
show 1 more comment
0
active
oldest
votes
Your Answer
StackExchange.ifUsing("editor", function () {
StackExchange.using("externalEditor", function () {
StackExchange.using("snippets", function () {
StackExchange.snippets.init();
});
});
}, "code-snippets");
StackExchange.ready(function() {
var channelOptions = {
tags: "".split(" "),
id: "1"
};
initTagRenderer("".split(" "), "".split(" "), channelOptions);
StackExchange.using("externalEditor", function() {
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled) {
StackExchange.using("snippets", function() {
createEditor();
});
}
else {
createEditor();
}
});
function createEditor() {
StackExchange.prepareEditor({
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
bindNavPrevention: true,
postfix: "",
imageUploader: {
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
},
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
});
}
});
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53490177%2fbest-way-to-implement-2d-array-on-heap%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
0
active
oldest
votes
0
active
oldest
votes
active
oldest
votes
active
oldest
votes
Thanks for contributing an answer to Stack Overflow!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53490177%2fbest-way-to-implement-2d-array-on-heap%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
1
Is there a reason you can't use an
std::vector
orstd::array
?– scohe001
Nov 26 '18 at 22:39
I would in most cases but I just was wondering why one be better then the other if for some reason you were forced.
– xxcellerator
Nov 26 '18 at 22:40
1
The second only makes one allocation, so it'll be faster at runtime. Might even be drastically faster in multi-threaded code with a single thread allocator. Though neither are something you should ever really find yourself writing unless using a legacy system.
– George
Nov 26 '18 at 22:43
1
int(*ptr)[200] = new int[200][200];
only works if you know the second dimension at compile time. Instead I suggest a simple matrix class.– user4581301
Nov 26 '18 at 22:57
Here's an article why you should reduce the number of calls to dynamic memory (on windows) randomascii.wordpress.com/2014/12/10/… If you're not planning on freeing all of the elements at the same time, you could go towards fragmentation. If you're planning on freeing all of the elements at the same time, you're probably better off using the "better way* structure to be more clear about your intentions.
– GandhiGandhi
Nov 27 '18 at 0:27