At what moment is memory typically allocated for local variables in C++?

后端 未结 5 841
故里飘歌
故里飘歌 2021-01-01 11:04

I\'m debugging a rather weird stack overflow supposedly caused by allocating too large variables on stack and I\'d like to clarify the following.

Suppose I have the

5条回答
  •  温柔的废话
    2021-01-01 11:14

    I checked on LLVM:

    void doSomething(char*,char*);
    
    void function(bool b)
    {
        char b1[1 * 1024];
        if( b ) {
           char b2[1 * 1024];
           doSomething(b1, b2);
        } else {
           char b3[512 * 1024];
           doSomething(b1, b3);
        }
    }
    

    Yields:

    ; ModuleID = '/tmp/webcompile/_28066_0.bc'
    target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64"
    target triple = "x86_64-unknown-linux-gnu"
    
    define void @_Z8functionb(i1 zeroext %b) {
    entry:
      %b1 = alloca [1024 x i8], align 1               ; <[1024 x i8]*> [#uses=1]
      %b2 = alloca [1024 x i8], align 1               ; <[1024 x i8]*> [#uses=1]
      %b3 = alloca [524288 x i8], align 1            ; <[524288 x i8]*> [#uses=1]
      %arraydecay = getelementptr inbounds [1024 x i8]* %b1, i64 0, i64 0 ;  [#uses=2]
      br i1 %b, label %if.then, label %if.else
    
    if.then:                                          ; preds = %entry
      %arraydecay2 = getelementptr inbounds [1024 x i8]* %b2, i64 0, i64 0 ;  [#uses=1]
      call void @_Z11doSomethingPcS_(i8* %arraydecay, i8* %arraydecay2)
      ret void
    
    if.else:                                          ; preds = %entry
      %arraydecay6 = getelementptr inbounds [524288 x i8]* %b3, i64 0, i64 0 ;  [#uses=1]
      call void @_Z11doSomethingPcS_(i8* %arraydecay, i8* %arraydecay6)
      ret void
    }
    
    declare void @_Z11doSomethingPcS_(i8*, i8*)
    

    You can see the 3 alloca at the top of the function.

    I must admit I am slightly disappointed that b2 and b3 are not folded together in the IR, since only one of them will ever be used.

提交回复
热议问题