Hur komplierar jag ett Microsoft Visual Studio Community projekt med Clang?

Permalänk

Hur komplierar jag ett Microsoft Visual Studio Community projekt med Clang?

Jag brukar använda mig av MSVC när jag kompilerar min C-kod. Men nu är jag behov utav VLA = Variable Length Array, dvs att kunna deklerarera en array så här:

int storlek = 5; int min_array[storlek] = {0};

Detta går faktiskt i C99 och uppåt, men i C++ är det totalt förbjudet! Detta är en anledning att välja C före C++.

Men hur som helst. Jag måste byta kompilator till Clang då Clang stödjer VLA. Hur kan jag göra detta i Visual Studio Community?

Jag har installerat LLVM

C:\vcpkg>vcpkg install llvm:x64-windows Computing installation plan... The following packages will be built and installed: llvm[clang,compiler-rt,core,default-options,default-targets,disable-assertions,disable-clang-static-analyzer,enable-bindings,enable-terminfo,enable-threads,enable-zlib,lld,target-spirv,target-x86,tools]:x64-windows -> 14.0.6 Detecting compiler hash for triplet x64-windows... Restored 0 package(s) from C:\Users\dmn\AppData\Local\vcpkg\archives in 1.63 ms. Use --debug to see more details. Installing 1/1 llvm:x64-windows... Building llvm[clang,compiler-rt,core,default-options,default-targets,disable-assertions,disable-clang-static-analyzer,enable-bindings,enable-terminfo,enable-threads,enable-zlib,lld,target-spirv,target-x86,tools]:x64-windows... -- Note: llvm only supports static library linkage. Building static library. -- Downloading https://github.com/llvm/llvm-project/archive/llvmorg-14.0.6.t... -> llvm-llvm-project-llvmorg-14.0.6.tar.gz... -- Extracting source C:/vcpkg/downloads/llvm-llvm-project-llvmorg-14.0.6.tar.gz -- Applying patch 0002-fix-install-paths.patch -- Applying patch 0004-fix-dr-1734.patch -- Applying patch 0005-fix-tools-path.patch -- Applying patch 0007-fix-compiler-rt-install-path.patch -- Applying patch 0009-fix-tools-install-path.patch -- Applying patch 0010-fix-libffi.patch -- Applying patch 0011-fix-install-bolt.patch -- Using source at C:/vcpkg/buildtrees/llvm/src/org-14.0.6-07c830a6c0.clean -- Found external ninja('1.10.2'). -- Getting CMake variables for x64-windows -- Downloading https://www.python.org/ftp/python/3.10.7/python-3.10.7-embed-... -> python-3.10.7-embed-amd64.zip... -- Configuring x64-windows -- Building x64-windows-dbg -- Building x64-windows-rel -- Installing: C:/vcpkg/packages/llvm_x64-windows/share/clang/copyright -- Installing: C:/vcpkg/packages/llvm_x64-windows/share/clang/usage -- Installing: C:/vcpkg/packages/llvm_x64-windows/share/lld/copyright -- Installing: C:/vcpkg/packages/llvm_x64-windows/share/lld/usage -- Installing: C:/vcpkg/packages/llvm_x64-windows/share/llvm/copyright -- Installing: C:/vcpkg/packages/llvm_x64-windows/share/llvm/usage -- Performing post-build validation -- Performing post-build validation done Stored binary cache: "C:\Users\dmn\AppData\Local\vcpkg\archives\8d\8d4439738585093ba8ff62152797f4cb73c8ab05607086a577d33c1cfe25651a.zip" Elapsed time to handle llvm:x64-windows: 3.18 h Total install time: 3.182 h The package llvm provides CMake targets: find_package(LLVM CONFIG REQUIRED) list(APPEND CMAKE_MODULE_PATH "${LLVM_CMAKE_DIR}") include(HandleLLVMOptions) add_definitions(${LLVM_DEFINITIONS}) target_include_directories(main PRIVATE ${LLVM_INCLUDE_DIRS}) # Find the libraries that correspond to the LLVM components that we wish to use llvm_map_components_to_libnames(llvm_libs Support Core IRReader ...) # Link against LLVM libraries target_link_libraries(main PRIVATE ${llvm_libs}) C:\vcpkg>

Edit:

Jag löste detta problem igenom att sätta "Use Vcpkg: No"

Men nu är jag ju utan VCPKG! Jag har behov utav det också.

Permalänk
Medlem

Nu kan jag inte Windows men känns som det saknas en del info här. Vad är det som gjorde att du inte kunde bygga med Vcpkg påslaget? Vad förhindrar dig från att använda Vcpkg nu?

Permalänk
Skrivet av orp:

Nu kan jag inte Windows men känns som det saknas en del info här. Vad är det som gjorde att du inte kunde bygga med Vcpkg påslaget? Vad förhindrar dig från att använda Vcpkg nu?

Om jag använder VCPKG så får jag lib-error när jag använder LLVM (Clang).

Permalänk
Medlem
Skrivet av heretic16:

Om jag använder VCPKG så får jag lib-error när jag använder LLVM (Clang).

Hade du kunnat posta vad du får för lib-error?

Permalänk
Hedersmedlem
Skrivet av heretic16:

Om jag använder VCPKG så får jag lib-error när jag använder LLVM (Clang).

Clang är väl inte nödvändigtvis helt kompatibel med cl? Måste du verkligen köra vcpkg (eller går det kanske att specificera att man vill ha för clang)?

Permalänk
Datavetare
Skrivet av heretic16:

Jag brukar använda mig av MSVC när jag kompilerar min C-kod. Men nu är jag behov utav VLA = Variable Length Array, dvs att kunna deklerarera en array så här:

int storlek = 5; int min_array[storlek] = {0};

Detta går faktiskt i C99 och uppåt, men i C++ är det totalt förbjudet! Detta är en anledning att välja C före C++.

Men hur som helst. Jag måste byta kompilator till Clang då Clang stödjer VLA. Hur kan jag göra detta i Visual Studio Community?

https://i.ibb.co/X549s53/Error.png
https://i.ibb.co/VLw36Y6/Compiler.png

Jag har installerat LLVM

C:\vcpkg>vcpkg install llvm:x64-windows Computing installation plan... The following packages will be built and installed: llvm[clang,compiler-rt,core,default-options,default-targets,disable-assertions,disable-clang-static-analyzer,enable-bindings,enable-terminfo,enable-threads,enable-zlib,lld,target-spirv,target-x86,tools]:x64-windows -> 14.0.6 Detecting compiler hash for triplet x64-windows... Restored 0 package(s) from C:\Users\dmn\AppData\Local\vcpkg\archives in 1.63 ms. Use --debug to see more details. Installing 1/1 llvm:x64-windows... Building llvm[clang,compiler-rt,core,default-options,default-targets,disable-assertions,disable-clang-static-analyzer,enable-bindings,enable-terminfo,enable-threads,enable-zlib,lld,target-spirv,target-x86,tools]:x64-windows... -- Note: llvm only supports static library linkage. Building static library. -- Downloading https://github.com/llvm/llvm-project/archive/llvmorg-14.0.6.t... -> llvm-llvm-project-llvmorg-14.0.6.tar.gz... -- Extracting source C:/vcpkg/downloads/llvm-llvm-project-llvmorg-14.0.6.tar.gz -- Applying patch 0002-fix-install-paths.patch -- Applying patch 0004-fix-dr-1734.patch -- Applying patch 0005-fix-tools-path.patch -- Applying patch 0007-fix-compiler-rt-install-path.patch -- Applying patch 0009-fix-tools-install-path.patch -- Applying patch 0010-fix-libffi.patch -- Applying patch 0011-fix-install-bolt.patch -- Using source at C:/vcpkg/buildtrees/llvm/src/org-14.0.6-07c830a6c0.clean -- Found external ninja('1.10.2'). -- Getting CMake variables for x64-windows -- Downloading https://www.python.org/ftp/python/3.10.7/python-3.10.7-embed-... -> python-3.10.7-embed-amd64.zip... -- Configuring x64-windows -- Building x64-windows-dbg -- Building x64-windows-rel -- Installing: C:/vcpkg/packages/llvm_x64-windows/share/clang/copyright -- Installing: C:/vcpkg/packages/llvm_x64-windows/share/clang/usage -- Installing: C:/vcpkg/packages/llvm_x64-windows/share/lld/copyright -- Installing: C:/vcpkg/packages/llvm_x64-windows/share/lld/usage -- Installing: C:/vcpkg/packages/llvm_x64-windows/share/llvm/copyright -- Installing: C:/vcpkg/packages/llvm_x64-windows/share/llvm/usage -- Performing post-build validation -- Performing post-build validation done Stored binary cache: "C:\Users\dmn\AppData\Local\vcpkg\archives\8d\8d4439738585093ba8ff62152797f4cb73c8ab05607086a577d33c1cfe25651a.zip" Elapsed time to handle llvm:x64-windows: 3.18 h Total install time: 3.182 h The package llvm provides CMake targets: find_package(LLVM CONFIG REQUIRED) list(APPEND CMAKE_MODULE_PATH "${LLVM_CMAKE_DIR}") include(HandleLLVMOptions) add_definitions(${LLVM_DEFINITIONS}) target_include_directories(main PRIVATE ${LLVM_INCLUDE_DIRS}) # Find the libraries that correspond to the LLVM components that we wish to use llvm_map_components_to_libnames(llvm_libs Support Core IRReader ...) # Link against LLVM libraries target_link_libraries(main PRIVATE ${llvm_libs}) C:\vcpkg>

Edit:

Jag löste detta problem igenom att sätta "Use Vcpkg: No"

https://i.ibb.co/09TS4y0/Compiler.png

Men nu är jag ju utan VCPKG! Jag har behov utav det också.

Är det du gör ovan "rätt" sätt för att installera clang?

LLVM-biblioteket må bygga hela kompilator-delen, men normalt är LLVM-biblioteket något man använder om man vill bygga sin egen kompilator.

Går ju att installera färdiga binärer direkt i VS

Sen finns den flera goda anledningar varför VLA inte finns i C++. Det anses vara ett misstag att det alls lades in i C99 då det finns en rad problem med finessen.

Den i praktiken onödig, de flesta OS hade redan någon variant av alloca() som kan användas för samma funktion (fast man kan även lägga in verfiering av storlek så det går att ge bättre felmeddelande om/när stacken "sprängs"). I Windows finns detta
https://learn.microsoft.com/en-us/cpp/c-runtime-library/refer...
som fungerar med alla kompilatorer.

VLA är med 100 % säkerhet en bugg om man inte vet största storleken på utrymmet. Vet man största storleken kan man (och bör man) använda statiska arrayer (vilket både C och C++ stödjer).

VLA gör också att sizeof kan få oväntande effekter, den kan ha icke-noll runtime-kostnad!

Men vill du absolut använda VLA ihop med vcpkg, clang, cmake och Windows verkar detta fungera

"C:\Program Files\CMake\bin\cmake.EXE" --no-warn-unused-cli -DCMAKE_TOOLCHAIN_FILE:STRING=C:/Users/kenne/tools/vcpkg/scripts/buildsystems/vcpkg.cmake -DCMAKE_EXPORT_COMPILE_COMMANDS:BOOL=TRUE "-DCMAKE_C_COMPILER:FILEPATH=C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\Llvm\x64\bin\clang-cl.exe" "-DCMAKE_CXX_COMPILER:FILEPATH=C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\Llvm\x64\bin\clang-cl.exe" -SC:/Users/kenne/source/repos/cmake_hello -Bc:/Users/kenne/source/repos/cmake_hello/build -G "Visual Studio 16 2019" -T ClangCL,host=x64 -A x64

Där jag då har vcpkg installerad här "C:/Users/kenne/tools/vcpkg" och har installerat clang som visas ovan.

Fungerar "sådär" i Visual Studio... Men fungerar felfritt med VS Code.

Visa signatur

Care About Your Craft: Why spend your life developing software unless you care about doing it well? - The Pragmatic Programmer

Permalänk
Skrivet av Yoshman:

Är det du gör ovan "rätt" sätt för att installera clang?

LLVM-biblioteket må bygga hela kompilator-delen, men normalt är LLVM-biblioteket något man använder om man vill bygga sin egen kompilator.

Går ju att installera färdiga binärer direkt i VS
<Uppladdad bildlänk>

Sen finns den flera goda anledningar varför VLA inte finns i C++. Det anses vara ett misstag att det alls lades in i C99 då det finns en rad problem med finessen.

Den i praktiken onödig, de flesta OS hade redan någon variant av alloca() som kan användas för samma funktion (fast man kan även lägga in verfiering av storlek så det går att ge bättre felmeddelande om/när stacken "sprängs"). I Windows finns detta
https://learn.microsoft.com/en-us/cpp/c-runtime-library/refer...
som fungerar med alla kompilatorer.

VLA är med 100 % säkerhet en bugg om man inte vet största storleken på utrymmet. Vet man största storleken kan man (och bör man) använda statiska arrayer (vilket både C och C++ stödjer).

VLA gör också att sizeof kan få oväntande effekter, den kan ha icke-noll runtime-kostnad!

Men vill du absolut använda VLA ihop med vcpkg, clang, cmake och Windows verkar detta fungera

"C:\Program Files\CMake\bin\cmake.EXE" --no-warn-unused-cli -DCMAKE_TOOLCHAIN_FILE:STRING=C:/Users/kenne/tools/vcpkg/scripts/buildsystems/vcpkg.cmake -DCMAKE_EXPORT_COMPILE_COMMANDS:BOOL=TRUE "-DCMAKE_C_COMPILER:FILEPATH=C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\Llvm\x64\bin\clang-cl.exe" "-DCMAKE_CXX_COMPILER:FILEPATH=C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\Llvm\x64\bin\clang-cl.exe" -SC:/Users/kenne/source/repos/cmake_hello -Bc:/Users/kenne/source/repos/cmake_hello/build -G "Visual Studio 16 2019" -T ClangCL,host=x64 -A x64

Där jag då har vcpkg installerad här "C:/Users/kenne/tools/vcpkg" och har installerat clang som visas ovan.

Fungerar "sådär" i Visual Studio... Men fungerar felfritt med VS Code.

Så du skulle rekommendera mig att inte använda VLA?

Permalänk
Skrivet av Elgot:

Clang är väl inte nödvändigtvis helt kompatibel med cl? Måste du verkligen köra vcpkg (eller går det kanske att specificera att man vill ha för clang)?

Jag måste verkligen köra vcpkg. Det är så enkelt att få ned C och C++ paket. Behöver bara skriva in ett kommando.

Permalänk
Medlem

Hela situationen låter märkligt. Nu kör jag inte Windows och kan inte verifiera något av detta men jag misstänker att vcpkg utöver att vara en pakethanterare även ger användaren kompilator- och länkarflaggorna för enskilda paket. Om det skulle finnas en inkompatibilitet mellan clang och vcpkg så är det väl för att vcpkg inte tillhandahåller samma flaggformat som clang förväntar sig. Detta borde @heretic16 kunna verifiera. Resterande arbete är ju hur man väljer att sy ihop vcpkg med ditt val av byggsystem.

Har jag missat något uppenbart?

Permalänk
Skrivet av orp:

Hela situationen låter märkligt. Nu kör jag inte Windows och kan inte verifiera något av detta men jag misstänker att vcpkg utöver att vara en pakethanterare även ger användaren kompilator- och länkarflaggorna för enskilda paket. Om det skulle finnas en inkompatibilitet mellan clang och vcpkg så är det väl för att vcpkg inte tillhandahåller samma flaggformat som clang förväntar sig. Detta borde @heretic16 kunna verifiera. Resterande arbete är ju hur man väljer att sy ihop vcpkg med ditt val av byggsystem.

Har jag missat något uppenbart?

Alltså, när jag väljer Clang på Visual Studio så fungerar det inte med att använda Vcpkg. När jag avaktiverar stödet för Vcpkg i Visual Studio så fungerar Clang. Då kan jag kompilera.

Jag använder bara Vcpkg för att tanka ned bibliotek.

Jag hänger inte riktigt med vad du menar.

Problemet sitter i att jag använder VLA i C. Detta kanske är en dålig strategi? VLA fungerar inte för C++, men för C fungerar det.

Vad tycker ni? Ska jag ersätta VLA med malloc?

Permalänk
Datavetare
Skrivet av heretic16:

Alltså, när jag väljer Clang på Visual Studio så fungerar det inte med att använda Vcpkg. När jag avaktiverar stödet för Vcpkg i Visual Studio så fungerar Clang. Då kan jag kompilera.

Jag använder bara Vcpkg för att tanka ned bibliotek.

Jag hänger inte riktigt med vad du menar.

Problemet sitter i att jag använder VLA i C. Detta kanske är en dålig strategi? VLA fungerar inte för C++, men för C fungerar det.

Vad tycker ni? Ska jag ersätta VLA med malloc?

Du skriver inte vilken projekt-typ du använder i Visual Studio. Testade lite och givet felet du får verkar du ha en projekt-typ där VS använder sin egna propretära format (vilket är fullt rimligt om man bara tänker använda det hela på Windows).

Verkar som den metoden i praktiken bara fungerar ihop med MSVC++ om man använder VCPKG

Kanske blev lite otydligt vad som är de viktiga delarna i CMake exemplet jag visade ovan... Den viktiga delen för att få VCPKG att lira ihop med LLVM/Clang är detta argument till cmake.exe

-DCMAKE_TOOLCHAIN_FILE:STRING=C:/Users/kenne/tools/vcpkg/scripts/buildsystems/vcpkg.cmake

Utan den får man liknade problem som i Visual Studios egna format. Denna fil hanterar "toolchain" specifika delar, d.v.s. den hanterar de delar som skiljer sig mellan Clang och MSVC++. Verkar som Visual Studio saknar motsvarande justeringar när man använder det inbyggda projektformatet.

CMake är inte ett byggsystem, det är ett system för att skapa byggsystem. Så om man går via CMake kan man ju låta utdata vara ett Visual Studio projekt där man satt LLVM/Clang som kompilator -> går att använda VCPKG ihop med Clang.

Fördelen med denna metod är att saker fungerar. Nackdelen är att man tappar en hel del av integrationen som Visual Studio användare nog förväntar sig. Testade inte allt för mycket, men verkar som man i praktiken behöver köra all förändringar av projektet via CMake CLI-verktyg. I det läget ger Visual Studio Code en betydligt bättre upplevelse då den är bättre anpassade för att jobba med CMake projekt.

Huvudfrågan här är ändå kanske: varför vill du använda VLA? Om det "bara" handlar om att allokera minne på stacken där mängden bara är tillgänglig "runtime", vad är det för fel på att använda alloca()/_alloca() (heter _alloca() i Windows, funktionen finns även i Linux och MacOS och heter då alloca())?

Värt att notera är att manualen för alloca() säger detta

alloca() is machine and compiler dependent; its use is discouraged.

det gäller även VLA i kompilatorer som stödjer funktionen, är ännu en i raden av anledningar varför t.ex. standard C++ inte har VLA.

alloca() fungerar både i C och i C++.

Visa signatur

Care About Your Craft: Why spend your life developing software unless you care about doing it well? - The Pragmatic Programmer

Permalänk
Skrivet av Yoshman:

Du skriver inte vilken projekt-typ du använder i Visual Studio. Testade lite och givet felet du får verkar du ha en projekt-typ där VS använder sin egna propretära format (vilket är fullt rimligt om man bara tänker använda det hela på Windows).

Verkar som den metoden i praktiken bara fungerar ihop med MSVC++ om man använder VCPKG

Kanske blev lite otydligt vad som är de viktiga delarna i CMake exemplet jag visade ovan... Den viktiga delen för att få VCPKG att lira ihop med LLVM/Clang är detta argument till cmake.exe

-DCMAKE_TOOLCHAIN_FILE:STRING=C:/Users/kenne/tools/vcpkg/scripts/buildsystems/vcpkg.cmake

Utan den får man liknade problem som i Visual Studios egna format. Denna fil hanterar "toolchain" specifika delar, d.v.s. den hanterar de delar som skiljer sig mellan Clang och MSVC++. Verkar som Visual Studio saknar motsvarande justeringar när man använder det inbyggda projektformatet.

CMake är inte ett byggsystem, det är ett system för att skapa byggsystem. Så om man går via CMake kan man ju låta utdata vara ett Visual Studio projekt där man satt LLVM/Clang som kompilator -> går att använda VCPKG ihop med Clang.

Fördelen med denna metod är att saker fungerar. Nackdelen är att man tappar en hel del av integrationen som Visual Studio användare nog förväntar sig. Testade inte allt för mycket, men verkar som man i praktiken behöver köra all förändringar av projektet via CMake CLI-verktyg. I det läget ger Visual Studio Code en betydligt bättre upplevelse då den är bättre anpassade för att jobba med CMake projekt.

Jag använder vanliga Visual Studio Projekt. Jag gillar inte CMake. Superdåligt.

Men då kanske jag ska vänja mig med MSVC.

Citat:

Huvudfrågan här är ändå kanske: varför vill du använda VLA? Om det "bara" handlar om att allokera minne på stacken där mängden bara är tillgänglig "runtime", vad är det för fel på att använda alloca()/_alloca() (heter _alloca() i Windows, funktionen finns även i Linux och MacOS och heter då alloca())?

Värt att notera är att manualen för alloca() säger detta

alloca() is machine and compiler dependent; its use is discouraged.

det gäller även VLA i kompilatorer som stödjer funktionen, är ännu en i raden av anledningar varför t.ex. standard C++ inte har VLA.

alloca() fungerar både i C och i C++.

Jag har aldrig använt mig av malloc, calloc, free, alloca osv. Så jag vet inte.

Jag kanske ska ersätta VLA med alloca() ? Vad tycker du?
Snabbhet är viktigt här.

Permalänk
Datavetare
Skrivet av heretic16:

Jag använder vanliga Visual Studio Projekt. Jag gillar inte CMake. Superdåligt.

Om man bara bryr sig om en plattform och en miljö komplicerar CMake bara saker och är därför inte vettigt att använda.

CMake har sina egna komplexiteter, man får i praktiken leva med dessa om man vill bygga moderna C/C++ projekt som ska gå att bygga för många OS, med många olika kompilatorer (även om vi rätt mycket bara har kvar 3 st för "vanliga" datorer, GCC, Clang och MSVC++) etc.

Skrivet av heretic16:

Men då kanske jag ska vänja mig med MSVC.

MSVC++ har alltid haft fokus på C++, det är en rätt kass C-kompilatorer. I alla fall om man vill ha något som håller sig till ANSI-C standarden.

Skrivet av heretic16:

Jag har aldrig använt mig av malloc, calloc, free, alloca osv. Så jag vet inte.

Jag kanske ska ersätta VLA med alloca() ? Vad tycker du?
Snabbhet är viktigt här.

Svaret är med 99,9 % sannolikhet att du inte bör använda VLA.

Vet du största möjliga storlek som någonsin behövs allokeras?

Är svaret "nej" har du garanterat en bug i ditt program om du använder VLA/alloca(). I det läget måste man använda malloc()/free() i C eller std::vector<> i C++

Är svaret "ja" och prestanda är kritiskt blir det minst lika snabbt att alltid allokera maxstorlek via "vanlig" C-array alt. C++ std::array<>. Det förutsatt att maximal storlek är relativt liten, inte större än enstaka kB. Större än så kommer overhead att allokera från heap:en ändå vara irrelevant i förhållande att läsa/skriva i det allokerade minnet.

Edit: vill du ändå använda VLA så kan du lika gärna köra med alloca(), kommer i praktiken bli samma sak som görs där som om man löser det med C99/VLA.

Visa signatur

Care About Your Craft: Why spend your life developing software unless you care about doing it well? - The Pragmatic Programmer

Permalänk
Skrivet av Yoshman:

Om man bara bryr sig om en plattform och en miljö komplicerar CMake bara saker och är därför inte vettigt att använda.

CMake har sina egna komplexiteter, man får i praktiken leva med dessa om man vill bygga moderna C/C++ projekt som ska gå att bygga för många OS, med många olika kompilatorer (även om vi rätt mycket bara har kvar 3 st för "vanliga" datorer, GCC, Clang och MSVC++) etc.

MSVC++ har alltid haft fokus på C++, det är en rätt kass C-kompilatorer. I alla fall om man vill ha något som håller sig till ANSI-C standarden.

Svaret är med 99,9 % sannolikhet att du inte bör använda VLA.

Vet du största möjliga storlek som någonsin behövs allokeras?

Är svaret "nej" har du garanterat en bug i ditt program om du använder VLA/alloca(). I det läget måste man använda malloc()/free() i C eller std::vector<> i C++

Är svaret "ja" och prestanda är kritiskt blir det minst lika snabbt att alltid allokera maxstorlek via "vanlig" C-array alt. C++ std::array<>. Det förutsatt att maximal storlek är relativt liten, inte större än enstaka kB. Större än så kommer overhead att allokera från heap:en ändå vara irrelevant i förhållande att läsa/skriva i det allokerade minnet.

Edit: vill du ändå använda VLA så kan du lika gärna köra med alloca(), kommer i praktiken bli samma sak som görs där som om man löser det med C99/VLA.

Då väljer jag malloc() och free().